统一变量报告未找到 LWJGL 3
Uniform variable reported not found LWJGL 3
简介
我正在 Java 中使用 Gradle 中的 LWJGL 3 依赖项创建 2D OpenGL 游戏。
目前我已经实现了一个 class VertexArray,它处理模型数据(vertices
、indices
、texturecoords
)——包括创建和处理 VAOs
和 VBOs
.
我为他们实现了着色器,并且可以成功地为投影和变换矩阵加载制服,例如 mat4
。然后我使用 org.l33tlabs.twl PNGDecoder
添加纹理并将其全部包装在 class Texture
中,它处理绑定纹理单元、解除绑定和从 openGL 中删除纹理。绑定函数还在绑定纹理之前调用 shader.setUniform1f("textureSampler",0);
。
代码
entityVertex.glsl
#version 400 core
in vec4 position;
in vec2 textureCoords;
out vec2 passTextureCoords;
uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;
void main()
{
gl_Position = projectionMatrix * transformationMatrix * position;
passTextureCoords = textureCoords;
}
entityFragment.glsl
#version 400 核心
in vec2 passTextureCoords;
out vec4 out_Color;
uniform sampler2D textureSampler;
void main()
{
vec4 colour = texture(textureSampler,passTextureCoords);
out_Color = colour;
}
vertexArray render
public void bind() {
glBindVertexArray(vao);
glEnableVertexAttribArray(VERTEX_ATTRIB);
glEnableVertexAttribArray(TCOORD_ATTRIB);
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
}
public void unbind() {
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(VERTEX_ATTRIB);
glDisableVertexAttribArray(TCOORD_ATTRIB);
glBindVertexArray(0);
}
public void draw() {
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0);
}
public void render(Shader shader, Texture texture) {
texture.bind(shader);
bind();
draw();
texture.unbind();
unbind();
}
texture
public void bind(Shader shader) {
shader.setUniform1f("textureSampler", 0); //<-- Line that throws error
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
}
public void unbind() {
glBindTexture(GL_TEXTURE_2D, 0);
}
问题
当我运行这个时,我从着色器中的这个方法得到错误"Could not find uniform variable 'textureSampler'!"
:
private Map<String, Integer> locationCache = new HashMap<>();
public int getUniform(String name) {
if (locationCache.containsKey(name))
return locationCache.get(name);
int result = glGetUniformLocation(ID, name);
if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
else locationCache.put(name, result);
return result;
}
public void setUniform1f(String name, float value) {
if (!enabled) start();
glUniform1f(getUniform(name), value);
}
Here 是主 Git 仓库的 link,如果你克隆你将需要导入和更新子模块(我在 java 中制作相同的游戏awt 和 openGL)
Here 是 GL 特定子模块的 link
有什么明显的问题吗?如果您需要查看更多代码,请告诉我。
glGetUniformLocation
returns -1 如果名称不是指定程序中活动统一变量的名称:
if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
if (result == -1) System.err.println("Could not find uniform variable '" + name + "'!");
简介
我正在 Java 中使用 Gradle 中的 LWJGL 3 依赖项创建 2D OpenGL 游戏。
目前我已经实现了一个 class VertexArray,它处理模型数据(vertices
、indices
、texturecoords
)——包括创建和处理 VAOs
和 VBOs
.
我为他们实现了着色器,并且可以成功地为投影和变换矩阵加载制服,例如 mat4
。然后我使用 org.l33tlabs.twl PNGDecoder
添加纹理并将其全部包装在 class Texture
中,它处理绑定纹理单元、解除绑定和从 openGL 中删除纹理。绑定函数还在绑定纹理之前调用 shader.setUniform1f("textureSampler",0);
。
代码
entityVertex.glsl
#version 400 core
in vec4 position;
in vec2 textureCoords;
out vec2 passTextureCoords;
uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;
void main()
{
gl_Position = projectionMatrix * transformationMatrix * position;
passTextureCoords = textureCoords;
}
entityFragment.glsl
#version 400 核心
in vec2 passTextureCoords;
out vec4 out_Color;
uniform sampler2D textureSampler;
void main()
{
vec4 colour = texture(textureSampler,passTextureCoords);
out_Color = colour;
}
vertexArray render
public void bind() {
glBindVertexArray(vao);
glEnableVertexAttribArray(VERTEX_ATTRIB);
glEnableVertexAttribArray(TCOORD_ATTRIB);
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
}
public void unbind() {
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(VERTEX_ATTRIB);
glDisableVertexAttribArray(TCOORD_ATTRIB);
glBindVertexArray(0);
}
public void draw() {
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0);
}
public void render(Shader shader, Texture texture) {
texture.bind(shader);
bind();
draw();
texture.unbind();
unbind();
}
texture
public void bind(Shader shader) {
shader.setUniform1f("textureSampler", 0); //<-- Line that throws error
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
}
public void unbind() {
glBindTexture(GL_TEXTURE_2D, 0);
}
问题
当我运行这个时,我从着色器中的这个方法得到错误"Could not find uniform variable 'textureSampler'!"
:
private Map<String, Integer> locationCache = new HashMap<>();
public int getUniform(String name) {
if (locationCache.containsKey(name))
return locationCache.get(name);
int result = glGetUniformLocation(ID, name);
if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
else locationCache.put(name, result);
return result;
}
public void setUniform1f(String name, float value) {
if (!enabled) start();
glUniform1f(getUniform(name), value);
}
Here 是主 Git 仓库的 link,如果你克隆你将需要导入和更新子模块(我在 java 中制作相同的游戏awt 和 openGL) Here 是 GL 特定子模块的 link
有什么明显的问题吗?如果您需要查看更多代码,请告诉我。
glGetUniformLocation
returns -1 如果名称不是指定程序中活动统一变量的名称:
if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
if (result == -1) System.err.println("Could not find uniform variable '" + name + "'!");