c - 为什么我的顶点法线会随着相机旋转而旋转?

标签 c opengl glsl

我的茶壶的顶点法线没有按预期变换。我怀疑法线矩阵没有在正确的坐标空间中变换。我想更多地了解这个问题以及如何解决它。

下面是演示问题的图像链接以及我用来绘制顶点法线的 GLSL 源代码。

茶壶:http://i.imgur.com/7gENzpO.png

近距离观察茶壶:http://imgur.com/aiWwVll.png

当我旋转相机时,带圆圈的顶点法线也会旋转:http://imgur.com/6laONRj.png

顶点.glsl:

attribute vec3 v_Position;        /* vertex position in model space */
attribute vec3 v_Normal;          /* vertex normal vector in model space */

uniform mat4 v_ModelViewMatrix;   /* model space to world space to eye space transform */
uniform mat4 v_ProjectionMatrix;  /* eye space to clip space transform */

out VS_OUT {
        vec3 normal;              /* vertex normal in eye space. */
} vs_out;

void main(void)
{
        vec4 WorldPosition = v_ModelViewMatrix * vec4(v_Position.xyz, 1.0);

        /* I know it's bad to compute this on the GPU but I wanted to be sure my matrix routines were not to blame. */
        mat3 NormalMatrix = transpose(inverse(mat3(v_ModelViewMatrix)));

        vs_out.normal = normalize(NormalMatrix * v_Normal);
        gl_Position = v_ProjectionMatrix * WorldPosition;
}

几何.glsl

layout(triangles) in;
layout(line_strip, max_vertices = 2) out;

in VS_OUT {
        vec3 normal;
} gs_in[];

void main(void)
{
        gl_Position = gl_in[0].gl_Position;
        EmitVertex();

        gl_Position = gl_in[0].gl_Position + 0.1 * vec4(gs_in[0].normal, 0.0);
        EmitVertex();

        EndPrimitive();
}

提前致谢。

最佳答案

请注意,在您的几何着色器中,gl_in[0].gl_Position 在剪辑空间中,而 gs_in[0].normal 在眼睛空间中。您可能想在几何着色器中进行投影。

关于c - 为什么我的顶点法线会随着相机旋转而旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35397677/

相关文章:

c - x86 汇编代码基本

c - 如何删除字符串句子中的空格

c - 为什么我在 C 语言的 LinkedList 插入方法中遇到段错误

java - 3D相交测试

iphone - 如何从“顶点缓冲对象”绘制单个三角形并设置其颜色?

opengl - 升级到 OS 10.11、Xcode 7.0.1 后,GLSL 纹理采样器无法工作

c - 弹性炼金术 : Returning a ByteArray from C function

c++ - glutDisplayFunc 显示垃圾

android - 打开 GL ES 2.0 - glGetAttribLocation 返回 -1

c++ - 法线贴图问题