- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
很多谷歌搜索都假设你对这些矩阵代表什么有基本的了解,而我却没有。
我了解 vector 和矩阵及其运算。
我想引用我无法理解的最简单的着色器代码,将法线和顶点放在眼空间中:
//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 包含哪些信息?它是否包含场景中每条法线的信息,以及它如何将进入顶点着色器的当前顶点法线转换为眼空间?或者矩阵是否随着每个顶点进入顶点着色器而改变,这就是它如何将进入顶点着色器的当前顶点的法线转换为眼睛空间?
最佳答案
两个指定的矩阵都是 uniform
。统一值是常量,它们不会在顶点之间改变(与 varying
变量相反,后者针对每个片段和 attribute
- 针对每个顶点而改变)。
gl_ModelViewMatrix
是 GL_MODELVIEW
矩阵的预定义统一变量集(受 glLoadIdentity
、glTranslate、
glRotate
、glScale
或 glLoadMatrix
)。
gl_NormalMatrix
是 transpose(inverse(gl_ModelViewMatrix))
,它是相同的矩阵,但比例因子倒置。可以在 http://www.arcsynthesis.org/gltut/Illumination/Tut09%20Normal%20Transformation.html 找到对这项技术的很好解释。
请注意,这种预定义制服在较新版本的 OpenGL 中已弃用(并且矩阵操作函数也已弃用)。
关于c++ - 着色器中的 gl_NormalMatrix 和 gl_ModelViewMatrix 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23210843/
很多谷歌搜索都假设你对这些矩阵代表什么有基本的了解,而我却没有。 我了解 vector 和矩阵及其运算。 我想引用我无法理解的最简单的着色器代码,将法线和顶点放在眼空间中: //vertex shad
我是一名优秀的程序员,十分优秀!