java - LWJGL glTranslate 做奇怪的事情

标签 java opengl draw lwjgl tile

这是我一直遇到的一个大问题。

我正在尝试使用 glTranslate 渲染多个图 block ,但是当我使用 x、y 坐标调用我的绘图函数时,图 block 的间距很奇怪(我不想要空格)。

这是发生了什么。

Drawing multiple tiles but having problems

这是我的代码:

绘制:

public void draw(float Xa, float Ya) {

    GL11.glTranslatef(Xa, Ya, 0);


    if(hasTexture) {
    Texture.bind();

    GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(0.5f, 0.5f, 1);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(0, 0);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(0, S);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(S, S);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(S, 0);

        GL11.glEnd();
    }

和我的渲染代码:

public void a() throws IOException {
    GL11.glTranslatef(0, 0, -10);
    int x = 0;
    while (x < World.BLOCKS_WIDTH - 1) {
        int y = 0;
        while (y < World.BLOCKS_HEIGHT - 1) {
            blocks.b[data.blocks[x][y]].draw(x, y);
            y++;
        }
        x++;
}

没有错误(可见错误除外)

最佳答案

您似乎没有初始化或推送/弹出当前转换。因此,翻译会累积,产生您所看到的效果,随着您翻译越来越大的值,它们之间的距离会越来越远。

假设您的街区相距 10 个单位。第一个是用 (0, 0) 的翻译绘制的,然后是 (0, 10),然后是 (0, 20),(0, 30) 等。

然而,随着翻译在 View 矩阵中的累积,您实际得到的是 (0,0)、(0,10)、(0,30)、(0,60) 等的翻译。

这很重要,因为它允许您从一系列简单的离散步骤构建复杂的转换。然而,当您想要渲染多个对象时,每个对象都有自己的转换,您需要在每个对象之间进行某种形式的重置。

您可以重新初始化整个矩阵,但这有点不整洁,并且需要了解之前已经完成的其他变换(例如相机等)。

相反,您可以将当前矩阵“推”到堆栈上,执行您想要执行的任何本地转换,渲染内容,然后将矩阵“弹出”,这样您就可以回到开始的地方,准备好渲染下一个对象。

我应该指出,所有这些功能在 GL 的更高版本中都已弃用。通过更现代的 API,您可以使用着色器,并可以提供您想要计算的任何转换。

关于java - LWJGL glTranslate 做奇怪的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15112439/

相关文章:

java - 我的 if-else 语句有什么问题?

java - Tomcat集群环境的架构问题

java - 找不到引用的方法 'com.google.firebase.tasks.Task setValue(java.lang.Object,java.lang.Object)'

java - 如何管理 Firebase Firestore 中的可选值并避免数据库中出现空字段?

java - 如何在 JPanel 中绘制矩形

delphi - 为什么带有 pmXOR 笔的 TCanvas.Rectangle() 只能工作 "sometimes"?

opengl - 带有 Oculus Rift 的原生渲染插件

opengl - 使用统一的 sampler2d[] 时出现无法解释的行为

opengl - 非片段着色器中的纹理查找如何工作?

python - 使用 PIL 绘制粗体/斜体文本?