问题标签 [depth-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
348 浏览

ios6 - 如何在 iOS6 上创建深度纹理。R16F 是一个选项吗?

我正在尝试将深度写入纹理。我想要线性深度,所以我尝试使用我尝试使用 R16F 纹理。我定义了这样的纹理:

但是当在 iPhone5 上使用帧捕获在 Xcode 上进行调试时,我在颜色缓冲区中得到一个未知纹理,并且没有任何内容写入深度缓冲区。

我也尝试过创建深度纹理:

但在这种情况下,深度缓冲区中似乎也没有写入任何内容。

我可以将事物渲染到深度缓冲区的唯一方法似乎是将第一个纹理定义为 RGBA32 ...

EXT_color_buffer_half_float 和 depth 扩展在 iOS6 中不是处于活动状态吗?

0 投票
0 回答
264 浏览

c++ - 在单个 FBO 上的多个深度纹理之间切换

我正在创建一个延迟渲染器并尝试使用 FBO 来实现这一点。首先,我使用了 3 个不同的 FBO(gbuffer、lbuffer 和“screen”)并且它工作正常。但是,它的性能非常差。我在这里读到,仅使用一个 FBO 并使用 glFramebufferTexture2D 切换纹理要快得多。

这种技术的问题是我从深度纹理中得到了大量无法解释和不可预测的行为(我正在进行深度剥离,因此在两个深度纹理之间切换)。似乎每次我从深度纹理 A 切换到纹理 B 时,A 都会被清除为零,反之亦然。

有谁知道使用 glFramebufferTexture2D 为同一个 FBO 切换深度纹理是否存在问题?我正在使用 gDebugger 检查纹理。

我正在使用 Visual C++ 2010 进行开发。

0 投票
2 回答
2398 浏览

c++ - 我的 Z 缓冲区计算有什么问题?

我正在实现一个 Z 缓冲区来确定应该在一个充满三角形的简单场景中绘制哪些像素。我有一个三角形、一个顶点、一个向量(当然是数学的 (x, y, z) 类型)的结构表示,以及一个将单个像素绘制到屏幕上的函数。这是我拥有的结构:

不幸的是,当我扫描将我的三角形转换为屏幕时,它依赖于计算深度来确定可见和要绘制的内容,我得到了不正确/不切实际的 Z 值(例如,三角形中某个点的深度超出了所有 3 个顶点的深度范围)!我一遍又一遍地查看我的代码,无法弄清楚我的数学是否有问题或者我在某个地方有粗心的错误,所以我将尝试准确地展示我正在尝试做的事情,希望其他人可以看到一些我不。(而且我仔细研究过确保浮点值仍然是浮点值,我正确地传递了参数等等,所以这真的令人困惑!)

总的来说,我的扫描转换算法会像这样(伪代码)在扫描线上填充像素:

为了获得每条扫描线的 zInit 值,我考虑平面方程 Ax + By + Cz + D = 0 并重新排列它以获得 z = -1*(Ax + By + D)/C,其中 x 和 y 是分别作为跨扫描线的当前 x 值和当前扫描线值本身插入。

对于扫描线上的后续 z 值,我内插为 zk+1 = zk - A/C,其中 A 和 C 来自平面方程。

为了获得这些 z 计算的 A、B 和 C,我需要由vertex v[3]当前三角形的 3 个顶点(数组)定义的平面的法线向量。为了得到这个法线(我在代码中命名为 planeNormal),我定义了一个叉积函数:

为了获得平面方程/我的 z 计算的 D 值,我使用平面方程 A(x-x1) + B(y-y1) + C(z-z1) = 0,其中 (x1, y1, z1)只是平面中的一个参考点。我只是选择了三角形顶点 v[0] 作为参考点并重新排列:

Ax + By + Cz = Ax1 + By1 + Cz1 因此,D = Ax1 + By1 + Cz1

所以,最后,为了得到用于 z 计算的 A、B、C 和 D,我对每个三角形都这样做了,其中trianglelist[nt]是场景的整个三角形数组中当前索引 nt 处的三角形:

从这里,在我描述的扫描转换算法中,我计算了 zs:

唉,在所有这些仔细的工作之后,有些事情发生了!在某些三角形中,深度值是真实的(符号除外)。对于由顶点 (200, 10, 75)、(75, 200, 75) 和 (15, 60, 75) 给出的三角形,所有深度都为 -75。对于所有顶点都在相同深度的其他三角形,情况也是如此。但是对于顶点 (390, 300, 105), (170, 360, 80), (190, 240, 25),所有的 z 值都超过 300!第一个是 310.5,其余的只是变大,最大值在 365 左右。当最深的顶点位于 z = 105 时,不应该发生这种情况!!!那么,在所有的漫无边际,任何人都可以看到可能导致这种情况的原因吗?如果这是与符号相关的事情,我不会感到惊讶,但是在哪里(毕竟,绝对值在恒定深度情况下是正确的)?

0 投票
1 回答
9062 浏览

c - glPolygonOffset中factor参数的含义和用法

我很难理解glPolygonOffset函数中第一个参数的含义。

官方文档说这个因素

指定用于为每个多边形创建可变深度偏移的比例因子。

然后

每个片段的深度值将在从适当顶点的深度值插值后偏移。offset 的值是 factor × DZ + r × units ,其中 DZ 是相对于多边形屏幕区域的深度变化的度量,而 r 是保证在给定的情况下产生可解析偏移的最小值执行。

我明白什么runit是什么。我不明白的是什么DZ,即“测量多边形屏幕区域的深度值变化”是什么意思,为什么我需要将因子设置为 0 以外的任何值。

如果我希望我的线框被偏移,我只需要在深度值上添加/减去几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义、用途和使用示例是什么?

0 投票
2 回答
1694 浏览

opengl - 在 OpenGL 中分离帧缓冲区和深度缓冲区

在 DirectX 中,您可以拥有单独的渲染目标和深度缓冲区,因此您可以绑定渲染目标和深度缓冲区,进行一些渲染,移除深度缓冲区,然后使用旧的深度缓冲区作为纹理进行更多渲染。

你会如何在opengl中解决这个问题?据我了解,您有一个包含颜色缓冲区和可选深度缓冲区的帧缓冲区对象。我不认为我可以同时绑定多个帧缓冲区对象,我是否必须在每次帧缓冲区对象更改时重新创建它(可能是一帧几次)?普通的opengl程序如何做到这一点?

0 投票
2 回答
1015 浏览

opengl - 在 OpenGL 保留深度测试中渲染 2D 图像(有深度)

我有一个来自外部源(比如软件光线追踪器)的图像,它也有一个深度缓冲区。我想在 OpenGL 场景(包含其他几个 3D 对象)中渲染该图像,以便正确更新 OpenGL 深度缓冲区,即应该使用正确的深度测试组合图像和其他 3D 对象。有任何想法吗?没有着色器的解决方案会很好。

0 投票
0 回答
972 浏览

ios - OpenGL ES 2.0 平面变形/扭曲效果 GPUImage iOS

正在玩一些很棒的 GPUImage 框架,并且能够使用片段着色器重现一些类似“凸”的效果。

但是,我想知道是否有可能使用 GPUImage 或任何其他 OpenGL 渲染到纹理来获得更复杂的 3D 平面弯曲。

我想要达到的效果看起来像这样 - 有没有机会使用深度缓冲区和顶点着色器获得类似的东西 - 或者只需要开发一些更复杂的片段着色器来模拟 Z 坐标?

实时相机输出 - 这是一张普通的纸

这就是我现在只使用片段着色器和一些周期性膨胀得到的 这是我在 GPUImage 中使用片段着色器可以获得的结果 - 不是很酷

谢谢

另一个想法是,也许可以在一些 3D 建模应用程序中对曲面进行原型制作,并以某种方式将纹理映射到它?

0 投票
1 回答
753 浏览

opengl - OpenGL深度纹理伪影

我正在为我的小 3d 引擎实现阴影映射。但是,深度纹理中似乎存在伪影,可以通过使用纹理并观察阴影,或者在四边形上绘制深度纹理来看到。

这是在四边形上绘制深度纹理时的样子:

是的,那些白色的小矩形不应该在那里。

那么,可能是什么原因造成的呢?

打开glfw窗口:

创建深度帧缓冲区和纹理:

渲染到深度纹理:

0 投票
1 回答
7030 浏览

opengl - glDepthRange 是如何工作的?

我的顶点线是:

现在,我正在通过以下方式更改 z 线:

现在,由于 glDepthRange 调用,我期望 z 线将映射到 -0.5 到 0.5 的范围,并且我可以看到一个合适的立方体,但是当我使用扭曲的几何图形在上面评论 glDepthRange 调用时,它会给出 o/p。

0 投票
1 回答
636 浏览

shader - CG着色器,控制每个片段的Z-Write?

是否可以以某种方式控制每个片段是否应将深度写入深度缓冲区?

我希望对我的对象进行正确的深度测试(因此我需要为每个片段输出准确的深度进行测试),但我只希望将一些片段写入缓冲区。

有什么办法吗?