许多谷歌搜索假设您对这些矩阵所代表的内容有基本了解,而不是。
我了解向量和矩阵及其操作。
我想引用一些我无法理解的最简单的着色器代码,将法线和顶点放在眼睛空间中:
//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有哪些信息?它是否包含场景中每个法线的信息,以及它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?或者矩阵是否会随着每个顶点进入顶点着色器而变化,那么它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?
答案 0 :(得分:10)
两个指定的矩阵都是uniform
s。统一值是常数,它们不会在顶点之间发生变化(与varying
变量相反,每个变量对于每个顶点都会发生变化,而attribute
- 对于每个顶点都是如此。
gl_ModelViewMatrix
是来自GL_MODELVIEW
矩阵的预定义统一变量集(受glLoadIdentity
,glTranslate,
glRotate
,glScale
或{{影响1}})。
glLoadMatrix
是gl_NormalMatrix
,它是相同的矩阵,但具有反转比例因子。可以在http://www.arcsynthesis.org/gltut/Illumination/Tut09%20Normal%20Transformation.html
请注意,这些预定义的制服在较新版本的OpenGL中已弃用(并且也不推荐使用矩阵操作函数)。