Jump to content
  • Advertisement
Sign in to follow this  
cherryyosh

help with a a deferred renderer lighitng pass

This topic is 3477 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!