我目前正在顯示列表中呈現三角形條,並顯示奇怪的小孔。Opengl三角形包含孔並消失有時
除此之外,一些看似三角形旋轉的環境時,就徹底消失了。
這裏是代碼:
public class Landscape {
int displayList;
public Landscape() throws IOException {
try {
Display.setDisplayMode(new DisplayMode(640, 480));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLU.gluPerspective(60f, 640f/480f, 0.0001f, 1000f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glPolygonMode(GL_FRONT_AND_BACK, GL_FLAT);
glEnable(GL_CULL_FACE);
BufferedImage heightMap = ImageIO.read(new File("heightmap.png"));
BufferedImage heightMapColor = ImageIO.read(new File("hoehenprofil.png"));
displayList = glGenLists(1);
glNewList(displayList, GL_COMPILE);
for (int z = 0; z < heightMap.getHeight(); z++) {
glBegin(GL_TRIANGLE_STRIP);
for (int x = 0; x < heightMap.getWidth(); x++) {
int y = 0xFF - heightMap.getRGB(x, z) & 0xFF;
int color = heightMapColor.getRGB(y-1, 0);
glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF));
glVertex3i(x, y*5, z);
if (z < heightMap.getHeight() - 1) {
y = 0xFF - heightMap.getRGB(x, z+1) & 0xFF;
color = heightMapColor.getRGB(y-1, 0);
glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF));
glVertex3i(x, y*5, z+1);
}
}
glEnd();
}
glEndList();
float camX = 500, camY = 500, camZ = -500;
float rotX = 45, rotY = 0, rotZ = 0;
long lastTick = System.currentTimeMillis();
int fps = 0;
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
if (Keyboard.isKeyDown(Keyboard.KEY_W)) camZ++;
if (Keyboard.isKeyDown(Keyboard.KEY_S)) camZ--;
if (Keyboard.isKeyDown(Keyboard.KEY_A)) camX--;
if (Keyboard.isKeyDown(Keyboard.KEY_D)) camX++;
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) camY++;
if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) camY--;
if (Keyboard.isKeyDown(Keyboard.KEY_Q)) rotY -= 0.5f;
if (Keyboard.isKeyDown(Keyboard.KEY_E)) rotY += 0.5f;
glRotatef(rotX, 1, 0, 0);
glRotatef(rotY, 0, 1, 0);
glRotatef(rotZ, 0, 0, 1);
glTranslatef(-camX, -camY, camZ);
glCallList(displayList);
Display.update();
fps++;
if (lastTick + 1000 <= System.currentTimeMillis()) {
lastTick += 1000;
System.out.println("FPS: " + fps);
fps = 0;
}
}
}
public static void main(String[] args) throws IOException {
new Landscape();
}
}
這似乎也出現禁用深度測試。即使啓用了剔除功能,這似乎也不起作用。
編輯:
除此之外,我得到一些黑色閃爍,只是在x或y軸周圍一定量的翻譯。這是一個截圖。
它會導致大量的滯後,我找不到任何理由。
EDIT2:
我縮放了x和z軸,並按照要求去除了屏幕截圖的y軸比例。它似乎只是在繞y軸伸展時導致錯誤。
您是否在創建GL上下文時請求了深度緩衝區?如果你沒有明確要求,你可能得不到一個。 – genpfault
我嘗試使用Display.create(new PixelFormat(1,1,1,4))請求深度緩衝區;它沒有改變任何東西。 – uwap
你可以嘗試一下Y沒有縮放,然後在X/Z上縮放,就像我們可以用法語說的:「mettre leploblèmeàplat」,來獲得更容易理解的輸出。 –