作为一个与我之前遇到的问题有些相似并且之前已经发布过的问题,我正在尝试在我的GLSL应用程序中正确显示法线。
为了说明,我正在使用RenderMonkey提供的ninjaHead.obj模型进行测试(您可以在此处获取)。现在,在RenderMonkey的预览窗口中,一切看起来都很好:
分别生成的顶点和片元代码如下:
我基于这个GLSL代码,但是我没有得到预期的结果...
我的顶点着色器代码:
然而,我的渲染产生了这个...
有人知道可能是什么原因导致这样,或者如何使其工作吗?
编辑: 针对kvark的评论,下面的模型呈现出没有任何法线/光照计算的平坦阴影。
这里是模型使用用于颜色的法线进行着色。我认为问题已经被找到了!现在问题是为什么它会被呈现成这样以及如何解决它?欢迎提出建议!
解决方案: 大家好,问题已经解决!感谢kvark提供的所有有益见解,这些见解肯定有助于我的编程实践,但恐怕答案来自于我这个巨大的笨蛋... 我的代码中display()函数设置了一个随机值的glNormalPointer偏移量的错误。以前是这样的:
但实际上应该是这样的:
![RenderMonkey](https://istack.dev59.com/UJgGl.webp)
顶点:
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代码,但是我没有得到预期的结果...
我的顶点着色器代码:
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;
}
然而,我的渲染产生了这个...
![openGL render](https://istack.dev59.com/6ghhX.webp)
编辑: 针对kvark的评论,下面的模型呈现出没有任何法线/光照计算的平坦阴影。
![Render flat shading](https://istack.dev59.com/7d1UZ.webp)
解决方案: 大家好,问题已经解决!感谢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 以节省时间,当你确定正在查看的代码部分是正确的时候,问题很可能出现在其他地方!
#version
指令是一个好习惯。 - Kos