我有一个正在开发的OpenGL应用程序。正在渲染的地形似乎没有遵循深度缓冲规则,所以我猜我在某个地方搞砸了
我的代码中有GL11.glEnable(GL11.GL_CULL_FACE)
这是飞机在没有四边形在另一个后面的情况下的样子,所以即使没有z缓冲区,事情看起来也很正常。请注意,这是从“自上而下”的视图中,其中“相机”在飞机上方
而现在,从不同的角度看
离场景最远的四边形正在更靠近计算机的四边形顶部渲染。以下是我对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();
}
下面是设置我的所有可变量和常量值的代码
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();
}
注:经过一些讨论,使用<code>glDepthFunc(GL_GREATER)和调用<code>glClearDepth(0.0f) 。
看起来发生的只是你正在剔除对象的背面。对于这些平面,如果你希望它们从背面可见,面部剔除必须完全禁用。据我所知,没有任何东西被画在另一个上面。
编辑:我确实看到了你之前关于人脸剔除的帖子。这看起来像是人脸剔除的正确结果;你只是从被剔除的那一边看着你画的脸。
我对openGL渲染很陌生,无论我做什么,深度深度都不起作用。我显然已经启用了深度测试(),并且我清除了每一帧的缓冲区。 但是 openGL 不断显示最后在其他人面前渲染的对象... 你可以在我的github上看到我的代码。这是两个相关的文件:主循环。我的主循环在,渲染在。 我正在使用java和lwjgl。
在DirectX中,您可以有单独的渲染目标和深度缓冲区,因此可以绑定渲染目标和一个深度缓冲区、执行一些渲染、移除深度缓冲区然后使用旧的深度缓冲区作为纹理进行更多渲染。 你会如何在opengl中做到这一点?根据我的理解,您有一个帧缓冲区对象,其中包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定多个帧缓冲器对象,我是否必须在每次更改时(可能一帧几次)重新创建帧缓冲器对象?普通的 opengl
我正在使用pyBullet,它是bullet3物理引擎的python包装器,我需要从虚拟相机创建点云。 这个引擎使用基本的OpenGL渲染器,我可以从OpenGL深度缓冲区中获得值 现在我有了具有深度值的Width*Height数组。我怎么能从中得到世界坐标?我试图保存。ply点云和点(width,height,depthBuffer(width,height)),但这并不能创建看起来像场景中对象
我在游戏中使用延迟渲染器。因此,第一个渲染过程是使用多个渲染rarget创建反照率和法线缓冲区,并填充深度缓冲区。所有这些缓冲区实际上都是纹理。 现在我想从其他渲染通道访问深度缓冲区,从而访问其他帧缓冲区,而不改变深度纹理。我只想读取深度值。对于这些通道,我主要绘制全屏四边形,我不希望他们更新深度纹理并将其消隐为深度值0。 如何将一个给定的深度纹理附加到另一个帧缓冲区,并确保它是只写的?
对于SSAO效果,我必须生成两种纹理:法线(在视图空间中)和深度。 根据微软教程(阅读深度模板缓冲区作为纹理章节),我决定使用深度缓冲区作为纹理。 不幸的是,渲染后我从深度缓冲区(下图)中没有得到任何信息: 我想这是不对的。奇怪的是,深度缓冲区似乎有效(我得到了正确的人脸顺序等)。 深度缓冲区代码: 使用第一遍渲染后,我将深度模板与其他渲染目标(颜色、法线)一起设置为纹理资源,将其附加到数组: 在
我正在使用JOGL,但这个问题一般适用于OpenGL。似乎存在类似的问题,但它们要么针对GLSL代码,要么与复制帧缓冲区的内容有关,要么是一般建议-使用帧缓冲区对象,而不是。 我正在做一些阴影映射。如何使用帧缓冲对象将深度通道直接渲染到纹理? 能否请你贴一段初始化纹理和帧缓冲对象的代码,以及渲染场景前初始化一切的代码? 目前,我使用<code>glCopyTexSubImage2D<code>。我