lwjgl纹理剔除不正确

时间:2014-12-20 18:54:30

标签: opengl lwjgl

所以我过去几天一直在研究体素游戏引擎,并且遇到了我的立方体模型的一些问题。

以下是正在发生的事情的截图:(已删除,因此我可以将照片链接进一步向下发布)

我所有的剔除似乎都是倒置的。我经历了堆栈溢出寻找答案,但我能找到的只与对象的渲染顺序有关。

我尝试更改我脸部的渲染顺序,但这似乎对剔除没有任何影响。

这是我的代码:

package com.musicalcreeper01.renderer.objects;

import static org.lwjgl.opengl.GL11.*;

public class ModelCube extends Object{

float BLOCK_SIZE = 1;

boolean RenderTop = true;
boolean RenderBottom = true;
boolean RenderBack = true;
boolean RenderFront = true;
boolean RenderLeft = false;
boolean RenderRight = true;

@Override
public void render (){
    glPushMatrix(); 

    // set the color of the quad (R,G,B,A)
    glColor3f(0.5f,0.5f,1.0f);

    glTranslatef(x, y, z);

    // draw quad
    glBegin(GL_QUADS);
    if(texture != null){
        texture.bind();
    }
    if(RenderBack){
        //Back
        glTexCoord3f(BLOCK_SIZE, 0, 0);
        glVertex3f(BLOCK_SIZE, 0, 0);

        glTexCoord3f(0, 0, 0);
        glVertex3f(0, 0, 0);

        glTexCoord3f(0, BLOCK_SIZE, 0);
        glVertex3f(0, BLOCK_SIZE, 0);

        glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, 0);
        glVertex3f(BLOCK_SIZE, BLOCK_SIZE, 0);

    }
    if(RenderFront){
        //Front
        glTexCoord3f(0, 0, BLOCK_SIZE);
        glVertex3f(0, 0, BLOCK_SIZE);

        glTexCoord3f(0, BLOCK_SIZE, BLOCK_SIZE);
        glVertex3f(0, BLOCK_SIZE, BLOCK_SIZE);

        glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);

        glTexCoord3f(BLOCK_SIZE, 0, BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE, 0, BLOCK_SIZE);
    }
    if(RenderRight){
        //Right
        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE);

        glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);

        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0);

        glTexCoord2f(0,0);
        glVertex3f(BLOCK_SIZE,0,0);
    }
    if(RenderBottom){
        //Bottom
        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0);

        glTexCoord2f(0,0);
        glVertex3f(0,BLOCK_SIZE,0);

        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE);

        glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);


    }
    if(RenderLeft){
        //Left
        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(0,0,BLOCK_SIZE);

        glTexCoord2f(0,0);
        glVertex3f(0,0,0);

        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(0,BLOCK_SIZE,0);

        glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
        glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE);

    }
    if(RenderTop){
        //Top
        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,0,0);

        glTexCoord2f(0,0);
        glVertex3f(0,0,0);

        glTexCoord2f(0,BLOCK_SIZE);
        glVertex3f(0,0,BLOCK_SIZE);

        glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
        glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE);

    }
    glEnd();

    glPopMatrix();
}
}

我唯一能想到的就是它,我正在使用四边形而不是三角形。我虽然四边形有四个角,但是每边绘制2个三角形会更容易,更有效。

如果有人愿意给我一些关于优化我的模型的提示,我会非常感激:)

我对openGL相当陌生,我在一两年后做了一些工作,当时我使用了三角形,而且效果很好。所以我猜测四边形是为什么它不起作用,但这对我来说似乎不合逻辑。

编辑:我认为它与法线有关,但我很难找到如何使用普通函数的答案。

编辑2:我刚刚改为使用gl列表渲染我的对象,正如Iggy所建议的那样(感谢;)),它似乎修复了我得到的一些渲染问题。现在,我的一排立方体从外面看起来像这样:http://i.stack.imgur.com/MYLiO.png而这来自内部:http://i.stack.imgur.com/Ckb9i.png

编辑3:已更新至最新版本。

1 个答案:

答案 0 :(得分:1)

在我看来你的缠绕顺序是错误的。基本上,您必须以逆时针顺序指定顶点,以将它们标记为正面。阅读更多here

至于优化,你应该研究使用带有顶点缓冲对象的现代OpenGL。这样,您就可以将所有verticescolorstexture coordinates压缩到一个数组中,然后通过一次调用将其推送到GPU。您可以再次阅读更多here。 (关于现代OpenGL的优秀教程)

enter image description here