Sign in to follow this  
cherryyosh

help with a a deferred renderer lighitng pass

Recommended Posts

cherryyosh    100
Hi, I am working on a deferred render, and have the first past done. Now I am working on the lighting pass but have came up with some strange errors. Not only does the light move and rotate with me (its suposted to be a fixed location point light) but there is a black spot in the center of the screen. Can someone please help me?
Quote:
in main void init(){ ... GLfloat pos[] = { 0.0, 1.0, 0.0, 1.0 }; GLfloat dif[] = { 0.0, 1.0, 1.0, 1.0 }; glLightfv( GL_LIGHT0, GL_POSITION, pos ); glLightfv( GL_LIGHT0, GL_DIFFUSE, dif ); } .... //start the second pass glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); glLightfv( GL_LIGHT0, GL_POSITION, pos );
and the light shaders vert
Quote:
varying vec2 TexCoord; void main(){ gl_Position = ftransform(); TexCoord = gl_MultiTexCoord0.st; }
and frag, its kinda rought, need to clean it up after
Quote:
uniform sampler2D colorMap; uniform sampler2D normalMap; varying vec2 TexCoord; const vec2 camerarange = vec2( 1.0, 1000.0 ); const vec3 screensize = vec3( 640.0, 480.0, 640.0 / 480.0); float DepthToZPosition(in float depth) { return camerarange.x / (camerarange.y - depth * (camerarange.y - camerarange.x)) * camerarange.y; } void main(){ vec3 n = texture2D( normalMap, TexCoord).xyz ; vec3 color = texture2D( colorMap, TexCoord ).rgb; float depth = texture2D( normalMap, TexCoord).w; vec3 FragPosition = vec3( (((gl_FragCoord.x / screensize.x) - 0.5 ) * 2.0), (((-gl_FragCoord.y / screensize.y) + 0.5 ) * (2.0 / screensize.z)), DepthToZPosition( depth) ); FragPosition.xy *= FragPosition.z; vec3 lightDir = normalize( gl_LightSource[0].position.xyz - FragPosition ); vec3 dir = lightDir; float dist = length( gl_LightSource[0].position.xyz - FragPosition ); vec3 pos = FragPosition;//vec3( 0.0, 1.0, 0.0 ); float nDotL = dot(n,dir); vec3 hv = normalize( dir + normalize( FragPosition ) ); if( nDotL > 0.0 ){ float att = 1.0 / ( gl_LightSource[0].constantAttenuation + gl_LightSource[0].linearAttenuation * dist + gl_LightSource[0].quadraticAttenuation * dist * dist); color.xyz += att * ( gl_LightSource[0].diffuse.rgb * nDotL + gl_LightSource[0].ambient.rgb ); float nDotHV = max(dot(n, hv), 0.0 ); color += att * 0.4 * gl_LightSource[0].specular.rgb * pow( nDotHV, 1.0 ); //0.4 = spec power, 1.0 = shineyness } //color = FragPosition; gl_FragColor = vec4( color, 1.0 ); }
and here is the first pass if anyone needs it
Quote:
vert varying vec3 Normal; varying vec2 TexCoord; //gl_TexCoord is deprecated in 1.3 =/ varying vec2 Position; void main(){ TexCoord = gl_MultiTexCoord0.st; //but so is MultiTexCoord.. find a replacement :/ gl_Position = ftransform(); Normal = gl_NormalMatrix * gl_Normal; Position = (gl_ModelViewMatrix * gl_Vertex).xy; } and frag uniform sampler2D TextureMap; uniform float farReciprocal; //the far plain Reciprocal, IE 1/far ( multi is faster then division ) //NOTE: varying is deprecated in 1.3 //change to in for frag and out for vert varying vec3 Normal; varying vec2 TexCoord; //Becouse gl_TexCoord is depercated.. varying vec2 Position; void main(){ //normal is not normalized, so we make the normal normal :P vec3 n = normalize( Normal ); float z = ( gl_FragCoord.z / gl_FragCoord.w ) * farReciprocal; gl_FragData[0] = texture2D( TextureMap, TexCoord ); gl_FragData[1] = vec4( n, z ); }

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this