【发布时间】:2020-10-02 19:20:15
【问题描述】:
简介
我正在使用 Gradle 中的 LWJGL 3 依赖项在 Java 中创建一个 2D OpenGL 游戏。
目前我已经实现了一个 VertexArray 类,它处理模型数据(vertices、indices、texturecoords)——包括创建和处理VAOs 和VBOs。
我他们实现了着色器,并且可以成功地为投影和变换矩阵加载均匀,例如mat4。然后我使用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
#版本 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 存储库的链接,如果你克隆你将需要导入和更新子模块(我在 java awt 和 openGL 中制作相同的游戏) Here 是指向 GL 特定子模块的链接
有什么明显的问题吗?如果您需要查看更多代码,请告诉我。
【问题讨论】:
-
这是一个错字
if (result == 1)->if (result == -1)分别是if (result < 0) -
请将此作为答案发布!
标签: java gradle opengl glsl lwjgl