【问题标题】:Uniform used in shader is inactive着色器中使用的 Uniform 处于非活动状态
【发布时间】:2013-12-10 15:41:27
【问题描述】:

我有以下着色器: 我的片段着色器:

#version 110
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;


void main() {
    gl_FragColor = vec4(1, 0, 0, 1);
}

还有我的顶点着色器:

#version 110

uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;

attribute vec3 vertex;

void main() {
    vec4 world =  modelMatrix * vec4(vertex, 1);
    vec4 camera = world * viewMatrix;
    gl_Position = projectionMatrix * world;
}

它们编译和链接都很好。当我打印出我的现役制服时,我得到了

projectionMatrix
modelMatrix

但没有 viewMatrix。当我尝试使用 glGetUniformLocation 获取 Uniform 时,我可以得到 projectionMatrix、modelMatrix 和我的顶点属性,那么为什么 viewMatrix 处于非活动状态?

【问题讨论】:

    标签: java opengl glsl


    【解决方案1】:

    问题出在顶点着色器的最后一行:

    gl_Position = projectionMatrix * world;
    

    您的意思可能是projectionMatrix * camera。否则,GLSL 编译器会看到 camera 没有被使用并对其进行优化,这意味着 viewMatrix 也不再被使用。未使用的制服不被认为是活跃的,这会导致你的困境。

    注意:您的查看变换也是向后的。你可能想要vec4 camera = viewMatrix * world。

    【讨论】:

    • 感谢您的快速回复!
    • 感谢关于我的视图变换向后的通知,我忘记了矩阵乘法不是可交换的
    • glPosition = projectionMatrix * camera 将等同于 glPosition = projectionMatrix * viewMatrix * modelMatrix * vec4(vertex, 1),这是您正在计算的。请注意,虽然组合矩阵通常被称为 MV、MVP 等,但实际的乘法顺序是P*V*M。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多