问题标签 [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.
matlab - Matlab中具有多个轴的深度缓冲模式
有没有办法在渲染具有两个轴的图形时使用深度缓冲区?
下面是示例:该图由两个轴组成,它们具有对称反转的移动波(为简单起见,红色和蓝色)。显然,这些波会相互交叉,所以如果从上面看,你会看到一个红蓝场,因为在某些部分,蓝色场在红色场之上,而在其他部分则相反。
从上面的图像可以清楚地看出,问题在于没有深度缓冲区,因为红色区域是在蓝色区域之后绘制的,并且完全重叠。
如果我在同一轴上绘制冲浪,我可以使用该SortMethod = 'depth'
选项,但是否可以在一个图中同步多个轴?
3d - 在 3ds max 中获取 16 位分辨率的 z-Buffer
我从如下图像中读出 z-Buffer:
我用了
然而,为了将图像写成 16 位,它们没有使用向下的 8 位,这意味着深度图像的分辨率被限制为 256 步。因此,读取的 z 缓冲区从一开始就是从 0 到 255。是否可以从一开始就读取 16 位分辨率的 z-Buffer 图像?
编辑:
代码必须生成可以读回 C++ 程序的任何类型的输出图像。为此,我需要 16 位的分辨率
功能
然而,返回 z 深度值 - 这意味着必须循环遍历相机的整个可见空间 - 并且如何才能将这些可见表面带到相机?即使有可能,这也会大大减慢进程
matlab - 如何在 Matlab 中对 z-Buffer 图像执行正交投影?
我面临与这篇文章中提到的相同的问题,但是,我不是用 OpenGL 来面对它,而只是用 MATLAB。深度作为到 GLSL 中相机平面的距离
我有一个从 3ds max 的 Z 缓冲区渲染的深度图像。我无法获得 z 缓冲区的正交表示。为了更好地理解,我将使用与上一篇文章相同的草图:
3 个星号是像素,C 是相机。星号线是“深度”。在第一种情况下,我得到了从像素到相机的距离。第二,我希望得到每个像素到平面的距离。
我的相机设置如下:
我计算截锥体设置如下:
并像这样设置投影矩阵:
在此之后,我读入深度图像,该图像被保存为 48 位 RGB 图像,其中每个通道都是相同的,因此只需要使用一个通道。
像素值必须反转,因为值越接近相机,它们就越亮。如果一个像素为 0(没有可渲染的对象),则将其设置为 2^16,因此,在位补码后,该值仍为 0。
为了将矩阵应用于每个 z-Buffer 值,我将向量布置为一维并在每个元素上构建一个像 [0 0 z 1] 这样的向量。
之后,我挑选出结果向量的第 4 个元素并将其重塑为图像
但是,Z-Buffer 不是正交的效果仍然存在,所以我错了吗?我的计算有问题吗?还是我在这里犯了错误?
计算后(白色仍然是“0”,但颜色轴已经改变)用 3ds max 实现这一点会很好,这将解决这个问题,但是我无法找到 z 缓冲区的这个设置. 因此,我想使用 Matlab 解决这个问题。
opengl - OpenGL GL_DEPTH_TEST 与 glDepthFunc 和 glDepthMask?
我一直在使用glDisable(GL_DEPTH_TEST)
禁用深度测试,认为它只会禁用深度“测试”。我猜我感到困惑的原因是因为我创建了两个函数,一个禁用深度“测试”,另一个禁用深度“写入”glDepthMask(GL_FALSE);
如果禁用GL_DEPTH_TEST
同时禁用“测试”和“写入”,那么它是否等同于执行以下操作:
我认为GL_DEPTH_TEST
除非我想同时禁用测试和写入,否则禁用几乎没有用,我想知道哪个更好。措辞似乎令人困惑,但也许只是我。我想禁用深度测试glDepthFun(GL_ALWAYS)
仍然会进行比较,我想没有办法完全禁用深度测试同时仍然允许写入?
opengl-es - 模型的某些部分在 OpenGL 中被奇怪地遮挡了
我正在使用 GLES20 在 Android 中渲染一个桶形对象。桶没有正确渲染,我不清楚问题出在哪里(纹理?模型?剔除?深度?):
我试过用谷歌的调试器调试。模型可以在调试器中正确渲染,纹理也可以正确加载。
我尝试了与、 和glFrontFace
相关glBlendFunc
的各种参数。但到目前为止,没有一种组合可以成功渲染桶。GL_DEPTH_TEST
GL_CULL_FACE
有谁知道这个渲染有什么问题?
PS:在调试器 GAPID 中,深度缓冲区似乎全黑(Y=1.0)。但我不确定这是否是调试器的问题?我已启用GL_DEPTH_TEST
. GL_LEQUAL
我也用过setEGLConfigChooser(true)
。
c++ - 深度缓冲区未填充阴影贴图渲染通道中的数据
我目前正在研究我在 Vulkan 中的阴影。我根据SaschaWillem和Itoral 的代码为我的阴影贴图创建了一个单独的渲染通道。我的应用程序的基础是基于VulkanTutorial。
我遇到的问题是 Z 值应该写入的深度缓冲区完全用零填充。我目前正在将与相机相同的 MVP 传递给阴影贴图着色器。我已将 RenderDoc 附加到我的应用程序中,并且阴影贴图通道的“网格输出”选项卡包含与常规通道完全相同的 gl_Position 值。不幸的是,这些值并没有像纹理查看器显示的那样保存到缓冲区中。
同时,常规深度缓冲区被常规着色器中计算的值正确填充。
“每次光栅化器产生一个片段时,深度测试都会检查新片段是否比前一个片段更接近。如果不是,则丢弃新片段。通过深度测试的片段将自己的深度写入深度缓冲区。”
看起来好像所有的片段都被丢弃了。
我对如何进行完全没有想法。你能指出我在哪里寻找这个问题的原因吗?
three.js - 如何在three.js中修复网格表面上线的z-fighting?
我正在尝试在 three.js 中的脸上画线
一切都很好,除了线条几乎不可见——不管我把它们做得有多厚:它们看起来像这样:
画线的代码是:
我怀疑 - 因为线条正好在表面上,所以它们不会被渲染(这就是所谓的z-fighting吗?)
有没有办法解决这个问题?
我正在考虑:
- 绘制圆柱体或其他形状而不是线条
- 沿着法线在曲面上方画一条线
有什么建议或方向吗?
3d - 为 PostGIS DB 中的 2D 渲染优化 3D 数据
我的PostGIS DB 中有 3D 模型。这些数据基本上是来自 Autocad DXF 的大量三角形面。
我用它在基于 THREEJS 的 webapp 中进行可视化,效果很好。但我有基于 OpenLayers 的 2D 视图。OpenLayers WebGL 渲染器不好(不适合线条和多边形)。我使用vectortiles(直接由postgis 生成)进行clint-vector 渲染,使用mapserver 进行服务器raseter 渲染。
两种方法都有效,但我显示的边缘太多(有时我在使用 MVT 时遇到浏览器内存使用问题)。我需要“优化”我的 3D 数据以最小化“吞吐量”。我想我可以为此做两件事:
1)合并共面面;
2)剪切不可见的面孔(看起来像 z-buffer 算法,但用于正交相机的矢量数据)。
我尝试用 postgis 做这两件事,但即使在预处理阶段使用它也非常缓慢。我正在寻找一些好的建议。可能我需要使用 PostGIS 拓扑系统或集群。但我没有找到任何好的文档/示例。
c++ - 使用自定义深度测试的深度战斗解决方案
我的问题的核心是我在纯 OpenGL 中进行深度战斗时遇到了麻烦。我有两个相同的几何形状,但一个比另一个简单。这形成了一组完美共面的多边形,我想在更简单的几何图形之上显示复杂的几何图形。
不出所料,当我使用 OpenGL 深度缓冲区按顺序绘制两组三角形时,它会导致我陷入深度战斗。目前,我已经修补了它,glPolygonOffset
但这个解决方案不适合我(我希望多边形完全共面)。
我的想法是在绘制第二组三角形时临时使用自定义深度测试。我想在第一组渲染期间保存片段的深度。接下来,我将使用glDepthFunc(GL_ALWAYS)
禁用深度缓冲区(但仍在其中写入)。在渲染第二组时,我会丢弃 z 大于我刚刚创建的内存的片段,但有一定的余量(我猜,至少是特定 z 处 Z 缓冲区精度的一倍)。然后我会将深度函数重置为GL_LEQUAL
.
实际上,我只是想为深度测试强加一定的余量。
这是一种可能的方法吗?问题是我不知道如何将信息(自定义深度缓冲区)从一个程序传递到另一个程序。
谢谢
PS:我还研究了帧缓冲区对象和延迟渲染,因为它显然允许通过“G-缓冲区”传递信息,但是一旦我写:
我的窗口变黑了......对不起,如果事情很明显我还不熟悉 OpenGL
opengl - OpenGL优化天空盒渲染
我正在学习如何使用来自以下资源的立方体贴图绘制天空盒。
我已经到了他谈到我们如何优化天空盒渲染的部分。我明白了,而不是先渲染天空盒,这将导致width*height
计算视口片段然后只被其他对象透支,最好最后绘制它并1.0f
通过分配gl_Position
天空盒来伪造它的深度值由于透视分割,顶点着色器gl_Position = pos.xyww
基本上使每个gl_FragCoord.z
等于。1.0f
现在我们得到一个天空盒,它的每个片段都具有最大深度值,1.0f
他将深度函数更改为GL_LEQUAL
而不是GL_LESS
.
这是我有点困惑的地方。
如果我们最后渲染天空盒并且它的深度值等于1.0f
为什么我们需要将深度函数更改为GL_LEQUAL
?将其设置为是否足够,GL_LESS
因为如果我们渲染场景中的所有其他对象,它的深度值可能会小于1.0f
所以它会将其值写入z-buffer
小于的值1.0f
。现在,如果我们将天空盒的深度函数设置为GL_LESS
它,那么它只会传递深度值小于实际值的片段,z-buffer
这可能只会传递其他对象没有覆盖的片段,那么为什么我们需要GL_LEQUAL
?