着色器中的gl_NormalMatrix和gl_ModelViewMatrix是什么?

时间:2014-04-22 05:09:15

标签: c++ opengl matrix glsl

许多谷歌搜索假设您对这些矩阵所代表的内容有基本了解,而不是。

我了解向量和矩阵及其操作。

我想引用一些我无法理解的最简单的着色器代码,将法线和顶点放在眼睛空间中:

//vertex shader
varying vec4 color;
varying vec3 N;
varying vec3 v;
void main(void)
{

    v = vec3(gl_ModelViewMatrix * gl_Vertex);
    N = normalize(gl_NormalMatrix * gl_Normal);

    color = gl_Color;

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
} 

我的问题:

(i)当顶点着色器循环遍历每个顶点时,gl_ModelViewMatrix是否随每个顶点循环而变化?或者gl_ModelViewMatrix在每个顶点迭代中是否保持不变,并且可以将任何顶点转换为眼睛空间?

(ii)与我的第一个问题类似,但是gl_NormalMatrix有哪些信息?它是否包含场景中每个法线的信息,以及它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?或者矩阵是否会随着每个顶点进入顶点着色器而变化,那么它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?

1 个答案:

答案 0 :(得分:10)

两个指定的矩阵都是uniform s。统一值是常数,它们不会在顶点之间发生变化(与varying变量相反,每个变量对于每个顶点都会发生变化,而attribute - 对于每个顶点都是如此。

gl_ModelViewMatrix是来自GL_MODELVIEW矩阵的预定义统一变量集(受glLoadIdentityglTranslate, glRotateglScale或{{影响1}})。

glLoadMatrixgl_NormalMatrix,它是相同的矩阵,但具有反转比例因子。可以在http://www.arcsynthesis.org/gltut/Illumination/Tut09%20Normal%20Transformation.html

找到对此技术的良好解释

请注意,这些预定义的制服在较新版本的OpenGL中已弃用(并且也不推荐使用矩阵操作函数)。