gpt4 book ai didi

java - OpenGL 深度缓冲区困惑

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:46 24 4
gpt4 key购买 nike

我正在开发一个 OpenGL 应用程序。正在渲染的地形似乎不遵循深度缓冲区规则,所以我猜我在某个地方搞砸了

我的代码中确实有 GL11.glEnable(GL11.GL_CULL_FACE)

这是飞机在没有四边形在另一个四边形后面的情况下的样子,因此即使没有 zbuffer,事情看起来也很正常。请注意,这是“自上而下”的 View ,其中“相机”位于平面上方

enter image description here

enter image description here

现在,从不同的角度来看

enter image description here

距离场景最远的四边形将渲染在更靠近计算机的四边形之上。这是我对 glOrtho 的调用,指定了近剪裁平面和远剪裁平面具体来说,最远的平面在应该被上升平面隐藏时是可见的

GL11.glOrtho(0, 1000, 0, 750, 50, -50);

有趣的是,如果我删除对 GL11.glEnable(GL_DEPTH_TEST) 的调用,zbuffer 似乎只适用于几个角度

编辑:我认为问题与我调用 glOrtho 的位置有关。它仅与代码开头的 glEnable 一起调用一次。我应该在 GL11.glLoadIdentity() 之后在循环中重复调用它(在循环期间重复调用)吗?

编辑2:添加显示渲染的代码

public void render() {
for (int y = 0; y < mapHeight - 1; y++) {
for (int x = 0; x < mapWidth - 1; x++) {
drawTile(x, y, rawMap[y][x], rawMap[y][x + 1], rawMap[y + 1][x + 1], rawMap[y + 1][x]);
}
}

}

private void drawTile(double xPos, double zPos, double height1, double height2, double height3, double height4) {
GL11.glColor3ub((byte) 255, (byte) 255, (byte) 255);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
GL11.glBegin(GL11.GL_QUADS);
Point3D normal = faceNormals[(int) zPos][(int) xPos];
GL11.glNormal3d(normal.getX(), normal.getY(), normal.getZ());
double xIn = xPos * 0.15;
double xOut = xIn + 0.15;
double zIn = zPos * 0.15;
double zOut = zIn + 0.15;


/* Original First */
GL11.glTexCoord2d(xPos * textureFactorX, zPos * textureFactorY);
GL11.glVertex3d(xIn, height1, zIn);

GL11.glTexCoord2d(xPos * textureFactorX, (zPos + 1) * textureFactorY);
GL11.glVertex3d(xIn, height4, zOut);

GL11.glTexCoord2d((xPos + 1) * textureFactorX, (zPos + 1) * textureFactorY);
GL11.glVertex3d(xOut, height3, zOut);

GL11.glTexCoord2d((xPos + 1) * textureFactorY, zPos * textureFactorY);
GL11.glVertex3d(xOut, height2, zIn);

GL11.glEnd();
}

这是设置所有 glEnables 和常量值的代码

public static void main(String[] args) {
try {
Display.setDisplayMode(new DisplayMode(1000, 750));
Display.create();
Display.setResizable(true);
} catch (Exception ex) {
ex.printStackTrace();
}
GL11.glMatrixMode(GL11.GL_PROJECTION);

// GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glCullFace(GL11.GL_FRONT_AND_BACK);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);

// Enable lighting
FloatBuffer lightFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(5f).put(5f).put(1f).put(0f).flip();
FloatBuffer ambientFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(2f).put(2f).put(2f).put(2f).flip();
FloatBuffer diffuseFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip();
FloatBuffer specularFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip();

GL11.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, GL11.GL_TRUE);
GL11.glShadeModel(GL11.GL_FLAT);

GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, ambientFloatBuffer);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, diffuseFloatBuffer);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, specularFloatBuffer);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, lightFloatBuffer);

System.out.println("Resource Directory: " + RESOURCE_DIR.toString());

new Game().start();
Display.destroy();
}

最佳答案

注意:经过一番讨论,在清除深度缓冲区之前使用 glDepthFunc(GL_GREATER); 并调用 glClearDepth(0.0f); 是有效的。

发生的情况似乎只是您正在剔除对象的背面。对于这些平面,如果您希望它们从背面可见,则必须完全禁用面剔除。据我所知,没有任何东西被绘制在另一个之上。

编辑:我确实看到了您之前关于面部剔除的帖子。这看起来像是面部剔除的正确结果;您只需从将被剔除的一侧查看绘制的面孔即可。

关于java - OpenGL 深度缓冲区困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22494126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com