与之前发布的问题有些类似,我试图让法线在我的GLSL应用中正确显示。 为了我的解释,我使用随RenderMonkey提供的ninjaHead.obj模型进行测试(you can grab it here)。现在,在RenderMonkey的预览窗口中,一切看起来不错: 分别产生的顶点和片段代码:GLSL法线效果奇怪
顶点:
uniform vec4 view_position;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// World-space lighting
vNormal = gl_Normal;
vViewVec = view_position.xyz - gl_Vertex.xyz;
}
片段:
uniform vec4 color;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v* color;
}
我根据我的GLSL代码,但我没有得到预期的结果...
My verte X shader代码:
uniform mat4 P;
uniform mat4 modelRotationMatrix;
uniform mat4 modelScaleMatrix;
uniform mat4 modelTranslationMatrix;
uniform vec3 cameraPosition;
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
vec4 pos = gl_ProjectionMatrix * P * modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex;
gl_Position = pos;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
vec4 normal4 = vec4(gl_Normal.x,gl_Normal.y,gl_Normal.z,0);
// World-space lighting
vNormal = normal4*modelRotationMatrix;
vec4 tempCameraPos = vec4(cameraPosition.x,cameraPosition.y,cameraPosition.z,0);
//vViewVec = cameraPosition.xyz - pos.xyz;
vViewVec = tempCameraPos - pos;
}
我的片段着色器代码:
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
//gl_FragColor = gl_Color;
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v * gl_Color;
}
但是我的渲染产生这个...
有谁知道什么可能导致这个和/或如何让它起作用?
编辑 针对kvark的评论,在这里是没有任何正常/照明计算显示所呈现的所有三角形渲染模型。
这里是与用于颜色的法线的模型着色。我相信问题已经找到!现在的原因是它为什么呈现这样以及如何解决它?欢迎提出建议!
SOLUTION 好大家的问题已经解决了!感谢kvark对他所有有用的见解,这绝对有助于我的编程练习,但恐怕答案来自于我是一个大规模的山雀......我的代码的display()函数有一个错误,它将glNormalPointer偏移量到一个随机值。它曾经是这样的:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, getNormalsBufferObject());
但应该是这样的:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, 0);
所以我想这是一个教训。永远不要盲目地按Ctrl + C和Ctrl + V代码来节省星期五下午的时间,并且...当你确定你正在查看的部分代码是正确的时,问题可能就在其他地方了!
请始终指定您的OpenGL版本。在GLSL中使用'#version'指令也是一种好的做法。 – Kos 2011-04-23 12:58:19
恭喜!最后:) – kvark 2011-05-03 14:45:31
你应该从你的问题中删除解决方案,并添加它作为答案(如果它真的解决了你的问题,接受它)。 – murgatroid99 2011-09-19 02:05:37