WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Thread Tools Rate Thread Display Modes
Old 10-06-2016, 02:50 PM
Strannix Strannix is offline
Join Date: Oct 2016
Posts: 3
Shader problems

Dear Shader Experts

For an outdoor scene I am trying to get a vertex / fragment shader bundle working that allows for rendering a dynamic sky model.

The project can be found here:

While I have basic knowledge of GLSL and shaders I am having a hard time to get this running. In fact, when I import the sky sphere and apply the shaders, the sphere gets transparent, i.e. disappears.

I assume that the problem might have to do with a missing uniform. For example, I am not sure whether it is possible to submit my uniforms as "vizmat" variables as I currently do for "mvp" and "star_pos"

I attach my code together with the vertex and fragment shaders below. I really appreciate any kind of help! :-)

Many thanks,


################ PYTHON CODE ################
import viz
import vizfx
import vizcam


logo = vizfx.addChild('logo.osgb')

cam = vizcam.PivotNavigate(distance=3.5)

# add sky sphere
mySphere = viz.add('sphere.obj')

# import textures
tint = viz.add('./img/tint.tga')
tint2 = viz.add('./img/tint2.tga')
sun = viz.add('./img/sun.tga')
moon = viz.add('./img/moon.tga')
clouds1 = viz.add('./img/clouds1.tga')
clouds2 = viz.add('./img/clouds2.tga')

# apply textures to buffers

# import shaders
myVert = viz.addVertexProgram('skydome_vshader.glsl')
myFrag = viz.addFragmentProgram('skydome_fshader.glsl')

# apply shaders to sphere

# Use static clip plane so projection matrix doesn't change
m = viz.MainWindow.getProjectionMatrix()

# assign uniforms to shaders
starPos = vizmat.Transform()

sunPos = viz.addUniformFloat('sun_pos', [0,1,0])
mvp = viz.addUniformMatrix('mvp', m)
time = viz.addUniformFloat('time', 0)
weather = viz.addUniformFloat('weather', 0.5)
starPos = viz.addUniformMatrix('star_pos', starPos)


# update sky model based on current time stamp
def ontimer(num):
time=viz.addUniformFloat('time', viz.FRAME_TIMESTAMP)
#sky_vp.param(0,viz.get(viz.FRAME_TIMESTAMP)*CLOUD _SPEED)


# add some ground
ground = viz.add('tut_ground.wrl')

################ VERTEX SHADER ################
#version 330 core
in vec3 vpoint;
in vec3 vnormal;
uniform vec3 sun_pos;//sun position in world space
uniform mat4 mvp;
uniform mat3 rot_stars;//rotation matrix for the stars
out vec3 pos;
out vec3 sun_norm;
out vec3 star_pos;

void main(){
gl_Position = mvp * vec4(vpoint, 1.0);
pos = vpoint;

//Sun pos being a constant vector, we can normalize it in the vshader
//and pass it to the fshader without having to re-normalize it
sun_norm = normalize(sun_pos);

//And we compute an approximate star position using the special rotation matrix
star_pos = rot_stars * normalize(pos);

################ FRAGMENT SHADER ################
#version 330 core
in vec3 pos;
in vec3 sun_norm;
in vec3 star_pos;
uniform sampler2D tint;//the color of the sky on the half-sphere where the sun is. (time x height)
uniform sampler2D tint2;//the color of the sky on the opposite half-sphere. (time x height)
uniform sampler2D sun;//sun texture (radius x time)
uniform sampler2D moon;//moon texture (circular)
uniform sampler2D clouds1;//light clouds texture (spherical UV projection)
uniform sampler2D clouds2;//heavy clouds texture (spherical UV projection)
uniform float weather;//mixing factor (0.5 to 1.0)
uniform float time;
out vec3 color;

//---------NOISE GENERATION------------
//Noise generation based on a simple hash, to ensure that if a given point on the dome
//(after taking into account the rotation of the sky) is a star, it remains a star all night long
float Hash( float n ){
return fract( (1.0 + sin(n)) * 415.92653);
float Noise3d( vec3 x ){
float xhash = Hash(round(400*x.x) * 37.0);
float yhash = Hash(round(400*x.y) * 57.0);
float zhash = Hash(round(400*x.z) * 67.0);
return fract(xhash + yhash + zhash);

void main(){
vec3 pos_norm = normalize(pos);
float dist = dot(sun_norm,pos_norm);

//We read the tint texture according to the position of the sun and the weather factor
vec3 color_wo_sun = texture(tint2, vec2((sun_norm.y + 1.0) / 2.0,max(0.01,pos_norm.y))).rgb;
vec3 color_w_sun = texture(tint, vec2((sun_norm.y + 1.0) / 2.0,max(0.01,pos_norm.y))).rgb;
color = weather*mix(color_wo_sun,color_w_sun,dist*0.5+0.5) ;

//Computing u and v for the clouds textures (spherical projection)
float u = 0.5 + atan(pos_norm.z,pos_norm.x)/(2*3.14159265);
float v = - 0.5 + asin(pos_norm.y)/3.14159265;

//Cloud color
//color depending on the weather (shade of grey) * (day or night) ?
vec3 cloud_color = vec3(min(weather*3.0/2.0,1.0))*(sun_norm.y > 0 ? 0.95 : 0.95+sun_norm.y*1.8);

//Reading from the clouds maps
//mixing according to the weather (1.0 -> clouds1 (sunny), 0.5 -> clouds2 (rainy))
//+ time translation along the u-axis (horizontal) for the clouds movement
float transparency = mix(texture(clouds2,vec2(u+time,v)).r,texture(clou ds1,vec2(u+time,v)).r,(weather-0.5)*2.0);

// Stars
if(sun_norm.y<0.1){//Night or dawn
float threshold = 0.99;
//We generate a random value between 0 and 1
float star_intensity = Noise3d(normalize(star_pos));
//And we apply a threshold to keep only the brightest areas
if (star_intensity >= threshold){
//We compute the star intensity
star_intensity = pow((star_intensity - threshold)/(1.0 - threshold), 6.0)*(-sun_norm.y+0.1);
color += vec3(star_intensity);

float radius = length(pos_norm-sun_norm);
if(radius < 0.05){//We are in the area of the sky which is covered by the sun
float time = clamp(sun_norm.y,0.01,1);
radius = radius/0.05;
if(radius < 1.0-0.001){//< we need a small bias to avoid flickering on the border of the texture
//We read the alpha value from a texture where x = radius and y=height in the sky (~time)
vec4 sun_color = texture(sun,vec2(radius,time));
color = mix(color,sun_color.rgb,sun_color.a);

float radius_moon = length(pos_norm+sun_norm);//the moon is at position -sun_pos
if(radius_moon < 0.03){//We are in the area of the sky which is covered by the moon
//We define a local plane tangent to the skydome at -sun_norm
//We work in model space (everything normalized)
vec3 n1 = normalize(cross(-sun_norm,vec3(0,1,0)));
vec3 n2 = normalize(cross(-sun_norm,n1));
//We project pos_norm on this plane
float x = dot(pos_norm,n1);
float y = dot(pos_norm,n2);
//x,y are two sine, ranging approx from 0 to sqrt(2)*0.03. We scale them to [-1,1], then we will translate to [0,1]
float scale = 23.57*0.5;
//we need a compensation term because we made projection on the plane and not on the real sphere + other approximations.
float compensation = 1.4;
//And we read in the texture of the moon. The projection we did previously allows us to have an undeformed moon
//(for the sun we didn't care as there are no details on it)
color = mix(color,texture(moon,vec2(x,y)*scale*compensatio n+vec2(0.5)).rgb,clamp(-sun_norm.y*3,0,1));

//Final mix
//mixing with the cloud color allows us to hide things behind clouds (sun, stars, moon)
color = mix(color,cloud_color,clamp((2-weather)*transparency,0,1));

Reply With Quote

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
passthrough fragment shader dcnieho Vizard 0 09-13-2016 11:44 AM
Texture Coordinate Generation (TexGen) using Shader goro Vizard 1 05-31-2013 01:44 AM
SSAO Shader Implementation FranciscoPeters Vizard 2 10-08-2011 04:19 AM
Multiple Textures for Diffuse and Specularity Shader Issue shivanangel Vizard 1 05-11-2009 10:44 AM
Specular Shader Issue shivanangel Vizard 2 05-06-2009 11:08 AM

All times are GMT -7. The time now is 09:49 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, vBulletin Solutions, Inc.
Copyright 2002-2018 WorldViz LLC