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();
}
}

唯一我能想到的可能是,我使用的是四边形而不是三角形。 我虽然因为一个四角有四个角,但是为每一边绘制两个三角形会更容易和更高效。

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

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

编辑:我假设它必须与法线,但我无法找到如何使用正常功能的答案。

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

编辑3:更新到最新版本。


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

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

在这里输入图像描述

链接地址: http://www.djcxy.com/p/34031.html

上一篇: lwjgl texture culling incorrect

下一篇: Rendering to framebuffer shows wrong result