英文:
Uniform variable reported not found LWJGL 3
问题
介绍
我正在使用Gradle在Java中创建一个2D OpenGL游戏,使用LWJGL 3依赖项。
目前,我已经实现了一个名为VertexArray的类,它处理模型数据(vertices
、indices
、texturecoords
),包括创建和处理VAOs
和VBOs
。
然后,我实现了着色器(Shaders),并可以成功加载像投影和变换矩阵这样的uniform变量。然后,我使用了org.l33tlabs.twl PNGDecoder
添加了纹理,并将所有这些包装在一个名为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 core
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); // <-- 报错的行
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);
}
这里是主Git存储库的链接,如果您克隆它,需要导入和更新子模块(我正在用Java AWT和OpenGL制作相同的游戏)。
这里是GL特定子模块的链接。
有明显的问题吗?如果您需要查看更多代码,请告诉我。
英文:
Introduction
I'm creating a 2D OpenGL game in Java using the LWJGL 3 dependencies in Gradle.
Currently I have implemented a class VertexArray, which handles model data (vertices
, indices
, texturecoords
) - including creating and handling the VAOs
and VBOs
.
I them implemented Shaders and can successfully load uniforms such as mat4
for the projection and transformation matrix. I then added in textures using the org.l33tlabs.twl PNGDecoder
and wrapped it all in a class Texture
, that handles binding the texture unit, unbinding and deleting the texture from openGL. The bind function also calls shader.setUniform1f("textureSampler",0);
before binding the texture.
Code
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 core
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);
}
Problem
When I run this, I get the error "Could not find uniform variable 'textureSampler'!"
from this method in the shader:
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 is a link to the main Git repo, if you clone you will need to import and updade submodules (im making the same game in java awt and openGL)
Here is a link to the GL specific submodule
Any obvious issues? If you need to see more code please let me know.
答案1
得分: 1
glGetUniformLocation
如果名称不是指定程序中活动统一变量的名称,则返回-1:
if (result == -1) System.err.println("无法找到统一变量'" + name + "'!");
英文:
glGetUniformLocation
returns -1 if the name is not the name of an active uniform variable in the specified program:
<s>if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
</s>
if (result == -1) System.err.println("Could not find uniform variable '" + name + "'!");
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论