gpt4 book ai didi

opengl - GLSL 法线的奇怪效果

转载 作者:行者123 更新时间:2023-12-01 05:40:40 25 4
gpt4 key购买 nike

有点类似于我之前遇到并发布过的问题,我试图让法线在我的 GLSL 应用程序中正确显示。
出于解释的目的,我使用 RenderMonkey 提供的 ninjaHead.obj 模型进行测试( you can grab it here )。现在在 RenderMonkey 的预览窗口中,一切看起来都很棒:
RenderMonkey
分别生成的顶点和片段代码为:

顶点:

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

有谁知道是什么导致了这种情况和/或如何使其发挥作用?

编辑
为了回应 kvark 的评论,这里是在没有任何法线/光照计算的情况下渲染的模型,以显示正在渲染的所有三角形。
Render flat shading

这是带有用于颜色的法线的模型着色。相信问题已经找到了!现在的原因是为什么它被渲染成这样以及如何解决它?欢迎提出建议!
Normal shading

解决方案
好了大家问题已经解决了!感谢 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 代码来节省周五下午的时间,并且...当您确定您正在查看的代码部分是正确的时,问题可能出在其他地方!

最佳答案

  • 你是什​​么P矩阵? (我想这是一个世界-> 相机 View 转换)。
  • vNormal = normal4*modelRotationMatrix;你为什么改变参数的顺序?这样做是将法线乘以反向旋转,这是您真正不想要的。改用标准顺序 (modelRotationMatrix * normal4)
  • vViewVec = tempCameraPos - pos .这是完全不正确的。 pos是同构裁剪空间中的顶点,而 tempCameraPos在世界空间中(我想)。您需要在与法线相同的空间(世界空间)中获得结果,因此对这个方程使用世界空间顶点位置( modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex )。
  • 关于opengl - GLSL 法线的奇怪效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5732323/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com