我使用的代码here基本上没有修改。本网站上的所有其他教程都适用于我。然而,当我尝试运行时,我最终只得到一个矢车菊屏幕。
经过一番挖掘,我发现(使用println的跟踪调试)所有对glGetUniformLocation的调用(从第248行开始)都返回负数。鉴于这是一个在LWJGL网站上托管的合理专业教程,并且我没有修改它(除了我改变的一些硬编码文件路径),我觉得它可能与我的openGL版本,我的显卡有关,或类似的奥术。
在glGetUniformLocation上查找specifics后,我发现如果你要求一个不存在的Uniform或者错误的类型,它可以返回负数。为了表明这不是我的问题,我将在这里重现GLSL代码和glGetUniformLocation的调用:
#version 150 core
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;
out vec4 pass_Color;
out vec2 pass_TextureCoord;
void main(void) {
gl_Position = in_Position;
// Override gl_Position with our new calculated position
gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_Position;
pass_Color = in_Color;
pass_TextureCoord = in_TextureCoord;
}
和调用:
projectionMatrixLocation = GL20.glGetUniformLocation(pId, "projectionMatrix");
viewMatrixLocation = GL20.glGetUniformLocation(pId, "viewMatrix");
modelMatrixLocation = GL20.glGetUniformLocation(pId, "modelMatrix");
System.out.println(pId+", "+projectionMatrixLocation+", "+
viewMatrixLocation+", "+modelMatrixLocation);
我错过了什么?
答案 0 :(得分:0)
考虑查询着色器以获取所有统一数据,以便您可以轻松查看哪些制服处于活动状态。这是唯一可靠的方式来确定。我这样做是为了在我的着色器类中构建内部地图的属性和制服,用于验证与着色器的所有交互(可以禁用)。
获得活动制服的数量:
GLint uniforms;
glGetProgramiv(programRef, GL_ACTIVE_UNIFORMS, &uniforms);
对于每个制服,请通过调用glGetActiveUniform
获取名称和数据类型。
这也包含在:How can I find a list of all the uniforms in OpenGL es 2.0 vertex shader pro
中