eve*_*ing 0 opengl lighting glsl
我在GLSL中制作每像素照明着色器.图为一个立方体网格,根据它们绘制的顺序,应该被遮盖的边在其他边上呈现.当我切换到我的固定功能opengl照明设置时,这不是问题.是什么导致它,我该如何解决?
顶点着色器:
varying vec4 ecPos;
varying vec3 normal;
void main()
{
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
/* first transform the normal into eye space and normalize the result */
normal = normalize(gl_NormalMatrix * gl_Normal);
/* compute the vertex position in camera space. */
ecPos = gl_ModelViewMatrix * gl_Vertex;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
varying vec4 ecPos;
varying vec3 normal;
uniform sampler2D tex;
uniform vec2 resolution;
void main()
{
vec3 n,halfV,lightDir;
float NdotL,NdotHV;
vec4 color = gl_LightModel.ambient;
vec4 texC = texture2D(tex,gl_TexCoord[0].st) * gl_LightSource[0].diffuse;
float att, dist;
/* a fragment shader can't write a verying variable, hence we need
a new variable to store the normalized interpolated normal */
n = normalize(normal);
// Compute the ligt direction
lightDir = vec3(gl_LightSource[0].position-ecPos);
/* compute the distance to the light source to a varying variable*/
dist = length(lightDir);
/* compute the dot product between normal and ldir */
NdotL = max(dot(n,normalize(lightDir)),0.0);
if (NdotL > 0.0) {
att = 1.0 / (gl_LightSource[0].constantAttenuation +
gl_LightSource[0].linearAttenuation * dist +
gl_LightSource[0].quadraticAttenuation * dist * dist);
color += att * (texC * NdotL + gl_LightSource[0].ambient);
halfV = normalize(gl_LightSource[0].halfVector.xyz);
NdotHV = max(dot(n,halfV),0.0);
color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV,gl_FrontMaterial.shininess);
}
gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)
着色器大多是这些的修改版本http://www.lighthouse3d.com/tutorials/glsl-tutorial/point-light-per-pixel/
好吧,你可能忘了启用它GL_DEPTH_TEST
.
您需要调用glEnable(GL_DEPTH_TEST);
此启用的OpenGL,以测试不同基元的深度.因此,当OpenGL渲染时,它不会随机渲染事物,而是实际需要落后的其他东西!
http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml
归档时间: |
|
查看次数: |
587 次 |
最近记录: |