Questions tagged «depth-buffer»

2
如何在2.5D世界中同时使用深度测试和纹理透明度?
注意:我已经找到了答案(我将在这个问题之后发布)-我只是想知道我是否做对了,或者是否有更好的方法。 我正在使用OpenGL ES(JOGL)制作“ 2.5D”等距游戏。“ 2.5D”是指世界是3D,但使用2D等距图块进行渲染。 我必须解决的原始问题是必须按顺序(从后到前)渲染纹理,以便图块正确重叠以产生合适的效果。经过一番阅读,我很快意识到这是2D的“老帽子”方法。由于玩家可以修改3D世界(因此东西可以出现在3D空间中的任何地方),因此很难有效地做到这一点-因此,我利用深度缓冲区似乎是合乎逻辑的。这意味着我不必担心以正确的顺序渲染内容。 但是,我遇到了一个问题。如果将GL_DEPTH_TEST和GL_BLEND一起使用,则会创建一种效果,在将对象与背景混合之前,先按z顺序对其进行“排序”(这意味着您应该在透明度应达到的地方获得一种奇怪的重叠)。 这是一些应该说明问题的伪代码(顺便说一句,我在Android上使用libgdx)。 create() { // ... // some other code here // ... Gdx.gl.glEnable(GL10.GL_DEPTH_TEST); Gdx.gl.glEnable(GL10.GL_BLEND); } render() { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); // ... // bind texture and create vertices // ... } 所以问题是:如何解决透明度重叠问题?

2
在OpenGL中,如何发现深度缓冲区的深度范围?
我正在为iOS开发GL多遍渲染应用程序。第一遍渲染到深度缓冲区纹理。第二遍使用深度缓冲区中的值来控制片段着色器的应用。我想将深度缓冲区中的值重新缩放为有用的值,但是在执行此操作之前,我需要知道深度缓冲区值的深度值范围。我该怎么做呢?

1
Z缓冲区的深度插值,带有扫描线
我必须编写自己的软件3d栅格化器,到目前为止,我已经能够将由三角形构成的3d模型投影到2d空间中: 我旋转,平移和投影点,以获得每个三角形的二维空间表示。然后,我取了3个三角形点,并实施了扫描线算法(使用线性插值法)以找到沿三角形边缘(左右)的所有点[x] [y],以便可以水平扫描三角形,一行一行地填充像素 这可行。除了我还必须实现z缓冲。这意味着,知道三角形的3个顶点的旋转平移后的z坐标后,我必须对使用扫描线算法找到的所有其他点的z坐标进行插值。 这个概念似乎很清楚,我首先通过以下计算得出Za和Zb: var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y); var Za = top_point_z + ((current_point_y - top_point_y) * Z_Slope); 然后,对于每个Zp,我都会在水平方向执行相同的插值: var Z_Slope = (right_z - left_z) / (right_x - left_x); var Zp = left_z + ((current_point_x - left_x) * Z_Slope); 并且如果当前z在该索引处比前一个z更接近查看器,则将颜色写入颜色缓冲区,并将新z写入z缓冲区。(我的坐标系是x:左->右; y:上->下; z:脸部->电脑屏幕;) 问题是,它陷入了困境。该项目在这里,如果您选择“ …

1
从深度图创建“磁性变形器”的最佳过滤器是什么?
在我的项目中,我正在创建一个用于变形高度详细的网格(衣服)以使其“适合”凸形网格的系统。为此,我使用商品的深度图和“船体”来确定在世界空间的哪个点发生偏离和程度。 简单地将所有被遮挡的顶点转换为“船体”定义的深度是相当有效的,并且具有良好的性能,但是它存在无法保留网格特征的问题,并且需要进行大量剔除才能避免假阳性。 相反,我想从深度偏差图中生成一组简单的“变形器”,这些变形器将(向外)“变形”的网格的所有顶点向外(在世界空间中)推入。这样,可以保留网格的所有特征,并且不需要复杂的启发式方法即可剔除不适当的顶点。 我不确定如何生成此变形器集。我正在想像一种算法,尝试将球面与某个范围内的连续偏差的每个斑块进行匹配,但不知道从哪里开始。 谁能建议一个合适的滤波器或算法来生成变形器?还是换一种方式“压缩”深度图? (*推动,因为它适合凸的“凸起”类人动物,所以变换很可能是从表面的POV“球形”开始的。) 编辑:这是正确建议的图像/图表,它说明了我正在尝试实现的目标。 另外,我应该说,自从发布此问题以来,我在这个问题上做了很多工作,尽管我从未解决过如何获得变形器的问题,但我最终还是决定将深度图不适用于: 如果变形网格是不完整的,有可能获得被映射纹素的意思是对的凸网的另一边(因为它们没有被掩盖那些靠近摄影机放在正确的一边)。 效率不如我希望的那样高,因为每个变形都需要6个贴图。 并不是说这些不是无法解决的,而是另一种解决方案,它涉及在GPU上运行的内核中进行碰撞测试,从而可以得到更高质量的结果,并且虽然可能没有那么快,但结果却简单得多。 我仍然认为这个问题很有趣,并且会对任何答案都感兴趣,因为我确信在某些情况下它会是更可取的。

4
阴影贴图和透明四边形
阴影贴图使用深度缓冲区来计算应在何处绘制阴影。 我的问题是我想要一些半透明的纹理四边形来投射阴影-例如广告牌树。由于将在所有四边形上设置深度值,而不仅仅是可见部分,因此它将投射四边形阴影,这不是我想要的。 如何使用阴影贴图使透明四边形投射正确的阴影?

3
使用深度分辨率的完整分辨率进行2D渲染
我正在使用正交投影为2D引擎进行从前到后的渲染器。我想使用深度缓冲区以避免过度绘制。我有一个16位的深度缓冲区,一个Z = 100的相机查看Z = 0,zNear为1,zFar为1000。每个渲染的精灵将其Z坐标设置为越来越远的值,从而允许深度测试跳过渲染下面的任何东西。 但是我知道Z位置以Z缓冲区值结束的方式是非线性的。我想利用16位深度缓冲区的完整分辨率,即允许65536个唯一值。因此,对于每个渲染的精灵,我想将Z位置增加到下一个位置,以与下一个唯一的深度缓冲区值相关联。 换句话说,我想将绘制的精灵的递增索引(0、1、2、3 ...)转到每个精灵的适当Z位置,以具有唯一的深度缓冲区值。我不确定这背后的数学原理。这样做的计算是什么? 注意我正在使用WebGL(基本上是OpenGL ES 2),并且我需要支持广泛的硬件,因此尽管gl_FragDepth之类的扩展名可能使此操作更容易,但出于兼容性原因,我无法使用它。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.