问题标签 [depth-testing]

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 回答
194 浏览

directx - HLSL 修改像素深度而不跳过 z 剔除

我正在尝试编写一个基于光线跟踪的着色器,其中对于四边形的每个像素,我计算来自相机的光线的原点和方向,并测试与我的场景(当前是球体)的交叉点。

如果发生相交,我想将深度缓冲区值设置为相交的深度,而不是将其保留为四边形的深度,所以我正在写入 DEPTH。我知道这意味着我的像素着色器的早期 z 剔除将被禁用,因为在完成该像素之前无法确定我的像素是在前面还是后面。

然而,我的着色器的一个属性是深度总是比用于早期 z 剔除的深度更深,因此执行早期 z 剔除仍然有效,因为在四边形前面的东西是保证在射线相交处的前面。我隐约记得有一些方法可以通知渲染管道,尽管深度正在被修改,但它总是会被修改为更深,这将留下适当的优化,否则会被关闭。尽管谷歌搜索了很多,但我一直无法找到这是什么,有人知道它是什么吗?如果这实际上不存在并且我记错了,那么即使在像我这样的用例中,有没有办法强制启用早期 z 剔除?

0 投票
1 回答
62 浏览

opengl - 旋转时物体晃动

我的opengl代码遇到问题

我正在尝试建造一所房子,并将其旋转 360°,为简单起见,我们假设房子的前墙有窗户和门,还有后墙。

在查看前墙时,我使用 DEPTH_BUFFER 看不到后墙,反之亦然,但是当我旋转房子时,门窗开始摇晃并变形。

0 投票
1 回答
237 浏览

opengl-es - glDepthMask 似乎没有按预期工作?

我渲染了两个三角形:一个是具有负深度值(顶点的 z 坐标)的较小红色三角形,另一个是具有正深度值的较大三角形。

//test1
在渲染三角形之前,我启用深度测试,然后绘制较小的三角形,最后绘制较大的三角形。渲染的结果是我所期望的。

//test2
在渲染三角形之前,我禁用深度测试但启用更新深度缓冲区(glDepthMask(GL_TRUE))。然后我先画出较小的三角形,然后开启深度测试并将深度比较功能设置为GL_LESS,最后画出较大的三角形。

我希望在蓝色较大的三角形内有一个红色的较小三角形。然而,渲染结果只是一个蓝色的大三角形。

我设置glDepthMask(GL_TRUE)将深度缓冲区的值更新为较小三角形的深度值。然后使用与深度缓冲区的值相比更大的三角形的深度值。这样,我想我可以在一个蓝色的大三角形中看到一个红色的小三角形。

我的代码有问题吗?

0 投票
1 回答
155 浏览

c++ - 使用 QOpenGLFramebufferObject 时深度测试不起作用

我遇到了使用QOpenGLFramebufferObject.

但是,如果我将默认帧缓冲区复制到QOpenGLFramebufferObjectusing中,它会起作用glBlitFramebuffer。我不知道原因。

这是代码:

我创建了QOpenGLFramebufferObject并且已经设置了深度附件,但在输出图像中没有绘制任何内容。似乎颜色附件丢失了。

但是如果我在绘图之前添加这些代码,它就起作用了。

所以,我不知道为什么 defaultFramebufferObject 中的深度信息而不是我创建的 m_framebuffer 中的深度信息。

有什么想法可以解决吗?

0 投票
1 回答
303 浏览

c++ - 深度缓冲区不适用于多个着色器程序

我正在使用用于手持系统的 OpenGL-ES 在 C++ 中编写 3D 图形渲染器,并且我正在使用贴花(纹理)着色器以及颜色填充着色器。我有两个渲染通道,我使用各自的程序并使用数组/元素缓冲区使用 glDrawElements 绘制数据。

尽管我在我的应用程序中启用了 GL_DEPTH_TEST,但我的贴花多边形始终呈现在我的彩色填充多边形前面。

我尝试重新设计我的投影/模型视图矩阵是如何构建并传递给着色器的,我尝试了不同的 glDepthFunc 参数,但我无法让它们正确渲染。

这是我的绘制代码 - 我开始每一帧

然后我计算世界空间多边形坐标并将其排列成 GLfloat 向量。我先绘制贴花数据:

然后用我的彩色多边形重复这个过程。随后是 SwapBuffer 和 WaitVSync 命令。

这是我创建三角形之一和立方体正面的代码:

此屏幕截图是我创建两个彩色三角形和一个纹理立方体时的当前输出:

渲染错误

蓝色箭头表示应该在前面渲染的三角形。有任何想法吗?

0 投票
0 回答
1564 浏览

unity3d - Unity:将渲染纹理的深度保存为 png

保存我的深度颜色模式纹理渲染的最简单方法是什么。可以在我的相机上不使用替换着色器的情况下完成吗?

似乎大部分工作只是在具有渲染目标的相机上将颜色模式设置为深度。在材料上预览它,它看起来很完美。我觉得保存它应该是微不足道的,但是我对渲染缓冲区的了解又不符合标准

我知道您可以创建一个 Texture2D 并使用 ReadPixels 复制具有标准 rgba 颜色的活动渲染纹理,但是,我在确定如何仅使用深度来完成它时遇到问题。

如果我正确理解深度纹理,它们是 32 位单通道吗?但是,ReadPixel 仅适用于 RGBA32、ARGB32 和 RGB24 纹理格式。当我使用 ReadPixel 将其保存为 png 时,我似乎只是得到了一个灰色图像

0 投票
1 回答
146 浏览

c++ - 使用自定义深度测试的深度战斗解决方案

我的问题的核心是我在纯 OpenGL 中进行深度战斗时遇到了麻烦。我有两个相同的几何形状,但一个比另一个简单。这形成了一组完美共面的多边形,我想在更简单的几何图形之上显示复杂的几何图形。

不出所料,当我使用 OpenGL 深度缓冲区按顺序绘制两组三角形时,它会导致我陷入深度战斗。目前,我已经修补了它,glPolygonOffset但这个解决方案不适合我(我希望多边形完全共面)。

我的想法是在绘制第二组三角形时临时使用自定义深度测试。我想在第一组渲染期间保存片段的深度。接下来,我将使用glDepthFunc(GL_ALWAYS)禁用深度缓冲区(但仍在其中写入)。在渲染第二组时,我会丢弃 z 大于我刚刚创建的内存的片段,但有一定的余量(我猜,至少是特定 z 处 Z 缓冲区精度的一倍)。然后我会将深度函数重置为GL_LEQUAL.

实际上,我只是想为深度测试强加一定的余量。

这是一种可能的方法吗?问题是我不知道如何将信息(自定义深度缓冲区)从一个程序传递到另一个程序。

谢谢

PS:我还研究了帧缓冲区对象和延迟渲染,因为它显然允许通过“G-缓冲区”传递信息,但是一旦我写:

我的窗口变黑了......对不起,如果事情很明显我还不熟悉 OpenGL

0 投票
1 回答
1194 浏览

javascript - 如何在three.js中按深度顺序渲染粒子?

免责声明:我对 three.js、WegGL 和一般的 3D 图形比较陌生。

我正在使用 three.js 以 3D 形式显示 GPS 轨迹中的点。我们必须能够可视化的数据集可能非常大(数十万个点),因此性能非常重要。

我使用一个Points对象,我用一个BufferGeometry包含所有点的填充。这些点按轨道的顺序添加,因此按时间顺序。

然后,我们使用PointsMaterial带有 2D 纹理(精灵)的 a,将点表示为一个圆,圆外的区域是透明的。2D 纹理是动态绘制到画布上的,因为颜色是动态的。

问题是,如果我们查看轨道方向上的点,即距离相机较远的点是在较近的点之后渲染的点,则会在点重叠的地方出现伪影,较近的点的透明部分被绘制在更远的点上:

3d 中的点

当我们从另一个方向看轨迹时,即从后到前渲染的点,问题就消失了:

在此处输入图像描述

我尝试了以下两个选项来解决该问题:

  • 使用alphaTest0 到 1 之间的值,哪种有效
    • 但是我们的点也可以是部分透明的(这是客户的要求),所以风险是 alphaTest 会剪掉应该实际渲染的点的一部分
    • 它会在点重叠的地方创建一个锯齿状边缘,看起来不太好

3d 中的点

  • 使用depthWrite: false点材质,它渲染得很好,但是无论相机的方向如何,最近的点总是被绘制在旧点上,它看起来很奇怪而且是错误的

3d 中的点

一个解决方案是实际渲染深度 顺序中的点,从最远开始到最近结束?

以下是代码的相关部分。

几何的构建。该timeline3d对象包含所有点并且来自 XHR 请求:

该材料:

0 投票
1 回答
126 浏览

c++ - 如何在 OpenGL 中将多边形带到前台?

下面的代码创建了 2 个正方形多边形,红色和绿色。
我试图在绿色顶部放置一个红色方块,但我做不到。
声明深度缓冲区,在必要时进行清理,正确配置正交系统。
如果我指定一个超出范围 (2;-2) 的值,则多边形会按原样消失。

0 投票
1 回答
103 浏览

c++ - 深度测试丢弃自定义帧缓冲区上的片段

在我的程序中,我将多个矩阵渲染到不同的帧缓冲区。最后,我将帧缓冲区创建的纹理渲染到三个 2D 四边形。问题是深度测试丢弃了自定义帧缓冲区的所有片段,除了第一个被渲染的片段。

在这里我初始化帧缓冲区:

在这里我渲染矩阵:

在这里我渲染三个四边形:

这是启用深度测试的输出:

并且禁用了深度测试:

似乎深度测试只是丢弃了第一个帧缓冲区之后的所有内容。