首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LWJGL-3:多维数据集不呈现

LWJGL-3:多维数据集不呈现
EN

Stack Overflow用户
提问于 2022-01-26 21:56:15
回答 1查看 33关注 0票数 -2

最近,我用LWJGL 3(轻量级Java游戏库3)和Java启动了一个项目,我一直在尝试呈现一个简单的多维数据集。但是,我的代码当前显示一个空的黑色屏幕。

这是我的渲染代码:

代码语言:javascript
运行
复制
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();
}

这是我的顶点着色器

代码语言:javascript
运行
复制
#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;
}

这是我的碎片着色器:

代码语言:javascript
运行
复制
#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的统一矩阵。

代码语言:javascript
运行
复制
[0, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]

并将这一行添加到代码中:

代码语言:javascript
运行
复制
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)改为

代码语言:javascript
运行
复制
color = vec3(testMatrix[0][0], testMatrix[1][1], testMatrix[2][2]);

如果我的假设是正确的,正如我所预期的,那么我可能会得到一个空白的屏幕。然而,如果我的假设是错误的,颜色将是vec3(0, 1, 0),或绿色,我会看到一个绿色的方块。

当我渲染它的时候,我看到了一个绿色的方块,而不是一个空白的屏幕,这是非常令人困惑的,因为我找不到问题的其他来源,我被困住了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-29 17:27:12

我很久很久没有解决这个问题了,但我意识到,当我把制服放到阴影中时,我是在存储矩阵的转位,而不是矩阵本身。我的color = vec3(testMatrix[0][0], testMatrix[1][1], testMatrix[2][2])没有工作的原因是因为我检查的矩阵值都在对角线上,这意味着它们不受影响。

我修正了这一点,只需将“transposed”属性从false更改为true。

代码语言:javascript
运行
复制
GL20.glUniformMatrix4fv(loc, false, matrixBuffer);

->

代码语言:javascript
运行
复制
GL20.glUniformMatrix4fv(loc, true, matrixBuffer);

更多解释:

我使用一维数组缓冲区来存储矩阵(因为这样可以更容易地将其存储到统一缓冲区中)。

下面是一个4x4矩阵供参考:

代码语言:javascript
运行
复制
m00 m01 m02 m03
m10 m11 m12 m13
m20 m21 m22 m23
m30 m31 m32 m33

为了将二维坐标转换为一维坐标,我使用了以下函数:

代码语言:javascript
运行
复制
m[x][y] -> [x + y * sz]

这意味着我的数组映射如下:

代码语言:javascript
运行
复制
0 4  8 12
1 5  9 13
2 6 10 14
3 7 11 15

我认为这是正确的命令。但事实证明,这正是我需要把矩阵放进去的顺序的转位!

我不想这个答案太长,但你可以找到更多的信息here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70870775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档