【问题标题】:What is the gl_NormalMatrix and gl_ModelViewMatrix in shaders?着色器中的 gl_NormalMatrix 和 gl_ModelViewMatrix 是什么?
【发布时间】:2014-04-22 05:09:15
【问题描述】:

很多谷歌搜索都假设你对这些矩阵所代表的内容有基本的了解,而我没有。

我了解向量和矩阵及其运算。

我想参考我看不懂的最简单的着色器代码,将法线和顶点放在眼睛空间中:

//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 包含哪些信息?它是否包含有关场景中每个法线的信息,以及它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?或者当每个顶点进入顶点着色器时,矩阵是否会发生变化,这就是它如何将进入顶点着色器的当前顶点法线转换为眼睛空间?

【问题讨论】:

    标签: c++ opengl matrix glsl


    【解决方案1】:

    两个指定的矩阵都是uniforms。统一值是常量,它们不会在顶点之间改变(与 varying 变量不同,变量随每个片段而变化,attribute - 对于每个顶点)。

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

    gl_NormalMatrixtranspose(inverse(gl_ModelViewMatrix)),这是相同的矩阵,但具有倒置的比例因子。可以在http://www.arcsynthesis.org/gltut/Illumination/Tut09%20Normal%20Transformation.html

    找到对这种技术的良好解释

    请注意,较新版本的 OpenGL 已弃用此预定义的制服(矩阵操作函数也已弃用)。

    【讨论】:

    • 说的太好了,谢谢。不推荐使用,您的意思是我应该自己将 ModelView 和其他矩阵制服以代码形式发送到着色器吗?如果是这样,它们有什么区别而不是作为预定义的制服自动发送?
    • 没有明显差异。如果您请求 GL 4+ 核心配置文件(仍应存在于兼容性配置文件中)或在 OpenGL ES2+ 中,则此制服将不可用。
    • 我想补充一点,gl_NormalMatrix被定义为mat3,它是modelview矩阵的上3x3子矩阵的逆转置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多