最近,我用LWJGL 3(轻量级Java游戏库3)和Java启动了一个项目,我一直在尝试呈现一个简单的多维数据集。但是,我的代码当前显示一个空的黑色屏幕。
这是我的渲染代码:
public void renderObject(Camera camera, ShaderProgram shader) {
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
Matrix4f mvpMatrix = Matrix4f.multiply(projection, Matrix4f.multiply(entity.modelMatrix(), view));
shader.uniformMatrix4f("mvpMatrix", mvpMatrix);
indexBuf.bind();
GL13.glActiveTexture(GL13.GL_TEXTURE0);
entity.getTexturedMesh().bindTexture();
GL11.glDrawElements(GL11.GL_TRIANGLES, entity.getTexturedMesh().mesh.getIndexVec().size(), GL11.GL_UNSIGNED_INT, 0);
indexBuf.unbind();
vao.unbind();
shader.stop();
}这是我的顶点着色器
#version 450 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoords;
out vec3 color;
out vec2 pass_texCoords;
uniform mat4 mvpMatrix;
void main(void) {
gl_Position = mvpMatrix * vec4(position, 1.0);
color = vec3(0.0, 1.0, 0.0);
pass_texCoords = texCoords;
}这是我的碎片着色器:
#version 450 core
in vec3 color;
in vec2 pass_texCoords;
out vec4 out_color;
uniform sampler2D textureSampler;
void main(void) {
out_color = texture(textureSampler,pass_texCoords);
}( Matrix4f是我做的一个定制的数学课。)
备注:发现,如果将gl_Position = mvpMatrix * vec4(position, 1.0)更改为glPosition = vec4(position, 1.0),则呈现(尽管我只能看到多维数据集的一个面)。因此,可以推断出问题在于mvpMatrix。
然而,我做了另外两个似乎与我的假设相矛盾的发现。
首先,我用mvpMatrix打印了renderObject,发现它确实是正确的。
因此,我推断出这个问题必须与函数uniformMatrix4f()有关,该函数应该将均匀性从代码传递给着色器。
为了验证我的假设,我决定建立一个名为testMatrix的统一矩阵。
[0, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]并将这一行添加到代码中:
shader.uniformMatrix4f("testMatrix", testMatrix);我还发现您可以通过将值传递给颜色来调试着色器。
因此,我将gl_Position = mvpMatrix * vec4(position, 1.0)改为glPosition = vec4(position, 1.0),out_color = texture(textureSampler,pass_texCoords)更改为out_color = vec4(color, 1.0)。
然后我把color = vec3(0.0, 1.0, 0.0)改为
color = vec3(testMatrix[0][0], testMatrix[1][1], testMatrix[2][2]);如果我的假设是正确的,正如我所预期的,那么我可能会得到一个空白的屏幕。然而,如果我的假设是错误的,颜色将是vec3(0, 1, 0),或绿色,我会看到一个绿色的方块。
当我渲染它的时候,我看到了一个绿色的方块,而不是一个空白的屏幕,这是非常令人困惑的,因为我找不到问题的其他来源,我被困住了。
发布于 2022-07-29 17:27:12
我很久很久没有解决这个问题了,但我意识到,当我把制服放到阴影中时,我是在存储矩阵的转位,而不是矩阵本身。我的color = vec3(testMatrix[0][0], testMatrix[1][1], testMatrix[2][2])没有工作的原因是因为我检查的矩阵值都在对角线上,这意味着它们不受影响。
我修正了这一点,只需将“transposed”属性从false更改为true。
GL20.glUniformMatrix4fv(loc, false, matrixBuffer);->
GL20.glUniformMatrix4fv(loc, true, matrixBuffer);更多解释:
我使用一维数组缓冲区来存储矩阵(因为这样可以更容易地将其存储到统一缓冲区中)。
下面是一个4x4矩阵供参考:
m00 m01 m02 m03
m10 m11 m12 m13
m20 m21 m22 m23
m30 m31 m32 m33为了将二维坐标转换为一维坐标,我使用了以下函数:
m[x][y] -> [x + y * sz]这意味着我的数组映射如下:
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15我认为这是正确的命令。但事实证明,这正是我需要把矩阵放进去的顺序的转位!
我不想这个答案太长,但你可以找到更多的信息here。
https://stackoverflow.com/questions/70870775
复制相似问题