问题标签 [zbuffer]

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 投票
1 回答
374 浏览

unity3d - Unity3D ViewModel Z深度缓冲区修复浮点

有谁知道如何解决网格和蒙皮网格的浮点问题?

Rust 找到了解决这个问题的方法,Garry 在这里解释:http: //garry.tv/2014/04/07/unity-viewmodels/

我想知道 rust 方式是如何工作的,而不是 unity3d 方式。

有谁知道它是如何工作的,如何解决这个问题?任何帮助都感激不尽。谢谢。

0 投票
1 回答
499 浏览

actionscript-3 - as3 - 如何对不断切换深度的显示对象进行排序?

我有一个 2.5D 游戏(类似于 3D 游戏的 2D 游戏),您可以在其中不断切换深度,当玩家走在对象前面时,它会显示在对象的顶部,当它走在对象后面时,对象会显示在顶部的播放器。就像当玩家的 y 小于对象的 y 时,玩家会落后于对象,反之亦然。

我尝试使用这样的代码:

但是,如果我多次这样做,我将需要大量代码,并且显示列表会混淆并以错误的顺序对错误的深度进行排序。有人可以用最少的代码展示一个有组织的深度改变器吗?

0 投票
1 回答
3839 浏览

c++ - opengl中的深度测试

我的程序拒绝进行深度测试。这两个球体对象总是按照它们创建的顺序绘制,而不是根据它们的位置。Sphere alpha 位于 (0, 0, 1),Sphere beta 位于 (0, 0, -10),但 OpenGL 仍然在 alpha 之上绘制 beta。我在我的程序中将深度测试设置为启用。

似乎没有任何效果。我希望 OpenGL 自动对窗口中绘制的任何对象进行深度测试。任何帮助或建议将不胜感激。这是完整的代码。

我使用的是 Ubuntu 14.04 操作系统。

0 投票
2 回答
357 浏览

render - Z缓冲区算法何时需要画家算法?

据我的老师说,在某些情况下,Z-buffer 算法需要画家算法才能在 2D 图像中渲染 3D 场景。

我认为 Z 缓冲区算法是一种扩展,是画家算法的增强:对我来说,Z 缓冲区算法可以做画家能做的所有事情,甚至更多(多边形的交集和循环重叠)。

但是,在某些情况下,如果不使用painter's one,Z-buffer 算法将无法正常工作......这些情况是什么?

0 投票
1 回答
1089 浏览

c++ - 在 CUDA 中实现一个简单的 Z-Buffer

我有一个 3D 点云,我将像素投影到图像平面。由于某些 3D 点被映射到同一个像素,因此我只希望我的相机具有最低 Z 值的像素。我使用 Z-Buffer(一个浮点数组)来跟踪我的深度值。这是一些伪代码:

我有一个完美运行的单核 CPU 版本。

cuda 版本看起来不错并且速度极快,但只有 z 测试起作用的区域非常“条纹”,这意味着一些背景点正在覆盖前景像素,我认为。此外,当我查看彩色图像时,我会看到随机的颜色条纹,其中包含图像中不存在的颜色。

CUDA 版本看起来更像这样:

我认为这里的并发性是一个问题。一个线程可能会在 Z-Buffer 中写入该像素最近的 z 值,但同时另一个线程读取旧值并覆盖正确的值。

如何在 CUDA 中防止这种情况发生?

Edit1:将块大小从 (16,16) 减小到 (1,1) 将导致更少的条纹图案,但它看起来像 1 个像素孔。

Edit2:这是一个最小的例子:

索引 0 处 z 的值应该是 1,因为它是最小值,但它是 5,这是 a 的最后一个值。

0 投票
2 回答
435 浏览

c++ - GlReadPixels 总是取自深度缓冲区 0

情况是,有许多相交的表面,不需要鼠标单击来确定光标位置的实际坐标,如果它指向什么或表面,我想使用这个glReadPixels,在着色器上绘制,并且最终glReadPixels给我的当前像素的深度总是等于0,因为这可能是什么,并且可能有新版本的替代品的任何功能,opengl在论坛上寻找信息,但发现我可以提供帮助,谢谢提前。

0 投票
1 回答
1435 浏览

webgl - WebGL 着色器 z 位置未用于深度计算

我一直在尝试一些 WebGL,但有一个错误我似乎无法找到如何修复。

目前我有以下设置:我有大约 100 个三角形,它们都有一个位置并且由一个gl.drawArrays函数绘制。为了让它们以我使用的正确顺序绘制,gl.enable(gl.DEPTH_TEST);这给出了正确的结果。

我现在遇到的问题是,如果我更新gl_Position顶点着色器中的三角形,则更新的 Z 值不会用于深度测试。结果是gl_Position.z可以在 a 为 10 的三角形之上绘制一个 a 为 1 的三角形gl_Position.z,这并不是我想要的。

我尝试了什么?

在渲染函数中。

以下代码用于创建缓冲区:

z 值较高的三角形尺寸要大得多(由于透视),但小三角形仍然出现在其上(由于渲染顺序)。

在片段着色器中,我用来gl_fragCoord.z查看这是否正确,较小的三角形(更远)接收到的 alpha 比较大的三角形(近距离)更高。

奇怪的绘图行为可能是什么原因?

0 投票
2 回答
1353 浏览

3d - 如何使用带有简单多边形的 ZBuffer?

我一直在编写一个简单的 3d 渲染器,并且一直在研究绘制顺序。引擎将 3d 多边形(按正确绘制顺序的 3d 点组)渲染到 2d 空间中,返回代表给定多边形投影的 2d 点列表。我这样做的方法可能有点不正统,因为我想看看我是否能够自己做,所以我在下面附上了我的投影代码:

目前,我通过按多边形最近角到相机的距离对三维多边形进行排序来确定绘制顺序,然后按照最远多边形到最近多边形的顺序绘制。但是,由于绘制顺序完全取决于多边形上最近点到相机的距离,因此有时会出现一些极端情况会阻止算法正常工作,如本视频所示:

https://youtu.be/olTOTOCw42M

我对 Z Buffer 做了很多研究,这个概念很简单——实际上与我正在做的非常相似。据我了解,对于每个渲染像素,都会比较在同一像素上渲染的所有点,并显示距离相机最近的 z 深度。但是,鉴于在这种情况下,我正在使用的唯一点是构成每个多边形角的点,我不知道一个比较包含在多边形内的任何点的 z 深度的好方法不仅在角落。

对于这个问题,我有两种可能的解决方案:

1)将每个多边形分成多个较小的多边形。当我在 python 中模拟渲染器时,我从未添加过 Z 深度排序,但我确实将每个多边形划分为多个较小的多边形,以便我可以非常轻松地单独点亮每个多边形,结果如下所示:

http://imgur.com/a/U3Xke

然而,这是非常昂贵的,因为许多投影点被多次投影,因为它们的值是通过计算相邻多边形的投影来确定的。也许有一种合法的方法可以解决这个问题,但对我来说这似乎太粗略以至于不正确。

2) 找到每个 3d 多边形所在的平面,将其绑定到多边形的形状,然后求解通过视角定向的各个扫描线与这些平面的交点,然后选择 z 深度最近的交点要在该扫描线的像素处显示的相机。这样,不是每个多边形的点被投影然后使用java的多边形填充方法填充,每个像素将被单独渲染。但是,我不确定如何“绑定”一个平面,使其不会超出多边形的边界,而且我理解起来有点棘手,因为目前数学对我来说有点太高级了。如果这是应该的方式,我可以学习它,我只是想事先确保它是一种可行的方法。

3) 将每个多边形分割成许多点而不是更小的多边形:我认为这种方法会有缺陷,因为良好渲染所需的点数(即每个像素一个 3d 点,不需要有多个 3d 点)相同的多边形形状渲染到完全相同的像素上,或者具有太少的 3d 点以致在渲染过程中“跳过”像素)随 z 深度而变化,并且计算放置这些点的位置的公式似乎很难制定每次移动相机时运行成本很高。

0 投票
2 回答
11424 浏览

python - 在 OpenCV 中读取 .exr 文件

我使用搅拌器生成了一些深度图,并以 OpenEXR 格式保存了 z 缓冲区值(32 位)。有没有办法使用 OpenCV 2.4.13 和 python 2.7 访问 .exr 文件中的值(逐像素深度信息)?在任何地方都找不到例子。我在文档中可以看到支持这种文件格式。但是尝试读取这样的文件会导致错误。

错误:

我发现最近的是这个链接和这个链接

0 投票
1 回答
585 浏览

bitmap - 如何在 Maxscript 中将位图保存为 16 位?

我想读出相机的 z 缓冲区,并将其渲染为图像。

我可以使用以下代码实现它:

但是,这会将图像保存为 24 位 Png,具有 3 个通道(每个通道 8 位)。我希望将其保存为灰度图像,我使用 16 位的像素表示。如何使用 max-script 实现这一点?