我被困在编程我的3D引擎。我有很多着色器工作,我刚刚创建了一个新的着色器。但由于某种原因,我的统一变量显示出一种奇怪的行为。
我知道如果不使用制服,该变量的位置将设置为-1。但我知道我的制服正在被使用。这就是我得到的。 (那个着色器毫无意义,但它应该仍然有用)
顶点着色器:
#version 150
in vec3 position;
in vec2 texCoords;
out mat4 hilf;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform float radius;
void main(void){
hilf = projectionMatrix;
gl_Position = projectionMatrix * vec4(position,1.0);
}
“radius”的位置设置为-1(因为它未被使用)。 viewmatrix也是如此。但我的“projectionMatrix”的位置也设置为-1!这对我来说毫无意义。现在是最奇怪的部分;当我删除行:gl_Position = projectionMatrix * vec4(position,1.0);
时,投影矩阵的位置大于-1。
我的Java调用如下所示:
location_projectionMatrix = super.getUniformLocation("projectionMatrix");
location_viewMatrix = super.getUniformLocation("viewMatrix");
location_radius = super.getUniformLocation("radius");
//-----------------
protected int getUniformLocation(String uniformName){
return GL20.glGetUniformLocation(programID, uniformName);
}
这是一个错误吗?我错过了什么吗?这是怎么回事?
答案 0 :(得分:0)
由于您没有使用变量radius
,因此在编译着色器时,它会被省略(优化)。因此编译后的着色器不包含该变量。这就是为什么该位置设置为无效值-1
。
在main
函数中使用着色器中的半径,它将返回有效的位置值。