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。 这使您可以将所有vertices
, colors
, texture coordinates
压缩到一个数组中,然后使用一次调用将其推送到GPU。 再次,您可以在这里阅读更多。 (关于现代OpenGL的优秀教程)