我试图在我的着色器中获取变量的统一位置。
@Override
public void getAllUniformLocations(){
location_transformationMatrix = super.getUniformLocation("transformationMatrix");
location_lightPosition = super.getUniformLocation("lightPosition");
location_lightColour = super.getUniformLocation("lightColour");
System.out.println(location_transformationMatrix + " | "
+ location_lightPosition + " | " + location_lightColour);
}
public int getUniformLocation(String name){
return GL20.glGetUniformLocation(programID, name);
}
然而,当它打印出来时,它打印完全错误:
0 | -1 | -1
0
用于固定功能管道,因此绑定一些东西会使程序完全崩溃,而另外两个只是返回-1,这是一个空值。
这是我的着色器加载代码:
public ShaderProgram(String vertexFile,String fragmentFile){
System.out.println("Comiling shader!");
vertexShaderID = loadShader(vertexFile,GL20.GL_VERTEX_SHADER);
fragmentShaderID = loadShader(fragmentFile,GL20.GL_FRAGMENT_SHADER);
programID = GL20.glCreateProgram();
GL20.glAttachShader(programID, vertexShaderID);
GL20.glAttachShader(programID, fragmentShaderID);
bindAttributes();
getAllUniformLocations();
GL20.glLinkProgram(programID);
GL20.glValidateProgram(programID);
start();
System.out.println(GL11.glGetError());
System.out.println("Comiled shader!");
}
着色器完全成功绑定,附加,验证,编译等,游戏在此时成功运行。然而,缺少统一的位置,所以我无法实现照明等事情。
这是我的顶点着色器:
#version 130
in vec3 position;
in vec2 textureCoords;
in vec3 normal;
out vec2 pass_textureCoords;
out vec3 surfaceNormal;
out vec3 toLightVector;
uniform mat4 transformationMatrix;
uniform vec3 lightPosition;
void main(void){
gl_Position = ftransform();
pass_textureCoords = textureCoords;
surfaceNormal = (transformationMatrix * vec4(normal, 0.0)).xyz;
toLightVector = (vec3(0, 20000, 0)) - (transformationMatrix * vec4(position, 1.0)).xyz;
}
变量0,1,2和3都绑定到属性,所以我希望这些数字能够返回" 4 | 5 | 6"
这是我的片段着色器:
#version 130
in vec2 pass_textureCoords;
in vec3 surfaceNormal;
in vec3 toLightVector;
out vec4 out_Color;
uniform sampler2D textureSampler;
uniform vec3 lightColour;
void main(void){
vec3 unitNormal = normalize(surfaceNormal);
vec3 unitLightVector = normalize(toLightVector);
float nDot1 = dot(unitNormal, unitLightVector);
float brightness = max(nDot1, 0.5);
brightness = brightness * 1.5;
vec3 diffuse = brightness * vec3(1, 1, 1);
vec4 text = texture(textureSampler, pass_textureCoords);
vec4 textureColor = vec4(diffuse, 1.0) * text;
if(textureColor.a<0.01){
discard;
}
out_Color = vec4(textureColor.r, textureColor.g, textureColor.b, textureColor.a);
}
答案 0 :(得分:3)
你得到的结果是绝对正确的,你对它们的解释不是:
0
用于固定功能管道,因此绑定了一些东西 将彻底崩溃该计划,
没有。 0
是一个完全有效的统一位置,与固定功能管道无关。您似乎将程序对象0
(表示旧版GL和兼容性配置文件中的固定功能管道)与每程序统一位置混淆。
另外两个很简单 返回
-1
,这是一个空值。
嗯,或多或少。 -1
表示该名称没有 acivte 制服。请注意,使用位置glUniform*()
调用-1
函数明确定义为无错误 - 此类调用不起作用。
您粘贴的着色器代码根本不使用lightPosition
和lightColour
制服,因此它们不存在。您可能打算在片段着色器中使用它们,但我敢打赌我的生活就是你没有以正确的方式在那里进行 - 即使你在代码中声明并使用它们,它们可能仍然没有对着色器输出的影响,因此仍未激活。