與之前發佈的問題有些類似,我試圖讓法線在我的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