-1

我正在用 OpenGL 编写一个 2D(实际上是 2.5D)等距游戏。为了避免对在某些情况下可能非常复杂的图块进行排序,我正在尝试模拟某种深度缓冲区。对于每个图块,我有两张图像,一张带有颜色信息,一张带有深度信息。

图片1:http : //dl.dropbox.com/u/91457585/depth_buffer_test.png

作为第一种方法,我创建了这些图片。这个想法是将它们相互叠加并使用着色器进行深度测试。在这种情况下,我知道这没有多大意义,但这只是查看它在技术上是否可行的第一种方法。

所以现在我的问题!

下面你会看到着色器的代码。应该将帧缓冲区的深度信息与对象的深度信息进行比较。但是它似乎不起作用,现在我在某处读到这不可能像我那样。

清单:

#version 130
uniform sampler2D colorMap;
uniform sampler2D zMap;  
uniform float level;

out vec4 gs_FragColor[ 2 ];

void main(void) { 
    float z = texture2D( zMap, gl_TexCoord[0].st ).r; 
    if ( z > gs_FragColor[ 1 ].r ){
      gs_FragColor[ 1 ] = vec4( z, 0, 0, 1 );
      gs_FragColor[ 0 ] = texture2D( colorMap, gl_TexCoord[0].st ).rgba;
    }
} 

那么有没有更好的方法来模拟深度缓冲区呢?也许通过写入真正的深度缓冲区?

4

2 回答 2

0

有(复杂且可能非常慢)模拟深度缓冲区的方法,但我不明白为什么你需要这样的东西。我建议使用常规的 OpenGL 深度测试:对于图块的每个片段,您在纹理中查找相应的深度值并将其写入gl_FragDepth. 如果您在主机代码 ( glEnable( GL_DEPTH_TEST)) 中启用了深度测试,OpenGL 将为您完成所有工作。

于 2013-02-25T10:36:33.537 回答
0
  1. 您可以模拟 Z 缓冲区,但它会太慢,因为您需要退回到它,这将导致多次通过(1. 通过每个重叠的瓦片块),更好更快的解决方案是直接在没有 OpenGL 的情况下进行到 Canvas 并将 Screen 和 Z 缓冲区存储为 DIB 位图或 1D/2D 数组。但是如果你有很多瓷砖要绘制到大分辨率,它也会很慢(但仍然比 OpenGL 的实现要快)。

  2. 您将瓦片深度图用作深度纹理并在深度测试开启的情况下正常渲染 - 这是解决您问题的最快最简单和最好的解决方案。(纹理中的 z 值被添加到每个片段的实际 z 坐标值中,因此您只能通过实际顶点坐标指定图块层)

强烈推荐第二选择...

于 2013-08-27T06:30:34.953 回答