【问题标题】:OpenGl GLSL uniform set returns errorOpenGL GLSL 统一集返回错误
【发布时间】:2014-10-01 18:29:46
【问题描述】:

我从着色器获取制服时遇到问题。行:

int u = GL20.glGetUniformLocation(program, uniform);

用于检查由字符串uniform定义的uniform是否在shader中。

这是一个示例检查代码:

System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix")==0);
System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix")==0);

结果:

false
true

奇怪的事情来了:顶点着色器代码如下:

#version 330

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 tex;
layout (location = 2) in vec3 nor;
layout (location = 3) in vec3 col;

uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;

out vec3 normal;

void main(){

    normal = nor;
    gl_Position = projectionMatrix * vec4(pos, 1);
} 

我已经测试了重命名统一,删除另一个统一,但唯一的统一 OpenGL 似乎识别的是“projectionMatrix”。

环境: Java 与 lwjgl 带有 mesa 10.4.0 的 linux 中的 OpenGl(也不适用于 Windows)

【问题讨论】:

    标签: java opengl glsl lwjgl


    【解决方案1】:

    允许 GLSL 编译器从发出的可执行着色器中去除未使用的变量,作为优化(使用更少的寄存器等)。 如果使用transformationMatrixuniform 计算着色器的返回值,则将其保存在着色器中,错误就会消失。

    这不是一个“硬”错误,请随意忽略它。您可能会遇到这种情况,尤其是当您出于调试目的更改 GLSL 代码时。

    【讨论】:

      【解决方案2】:

      glGetUniformLocation() 如果未找到制服,则返回 -1。来自man page

      如果名称与程序中的活动统一变量不对应或名称以保留前缀“gl_”开头,则此函数返回-1。

      所以错误测试需要是:

      System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix") == -1);
      System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix") == -1);
      

      正如另一个答案中所建议的,确实可以在编译/链接着色器时消除未使用的制服。但这不是你在这种情况下观察到的。 0 是有效的统一位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多