问题标签 [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 回答
560 浏览

3d - 阴影贴图,woo 技巧,深度剥离

我正在尝试制作一个自阴影对象(opengl/glsl)。我做的步骤是:

1- 从灯光渲染场景以获得深度图

2- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于存储在深度图中的深度,则该点处于阴影中。

但随之出现了暗影粉刺的问题。所以,第二步会像:

2- ...如果(abs(DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS)点在阴影中。

但它仍然没有给我很好的结果(没有合适的偏差值)。

所以,我实现了 woo 技巧(从光中找到第一个和第二个表面,然后将中点存储在深度缓冲区中)。为此,我进行了两次深度剥离。步骤是:

1- 像往常一样从灯光渲染场景以获得第一张深度图。

2- 从光照渲染场景得到第二张深度图,如果一个点到光照的距离等于第一张深度图中的距离,则丢弃该点(即不渲染第一层)。

3- 存储为您的最终深度图(第一个深度图 + 第二个深度图)/2

4- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于深度图中存储的深度,则该点处于阴影中。

现在问题出现在第2步,我们之前遇到的SAME问题:当第一层和第二层接近时会出现舍入误差并且还会出现某种粉刺,并且也没有合适的偏差值。所以,我没有从 woo 算法中得到任何好处,它只是将问题转移到深度剥离部分。

你怎么能解决这个问题?

0 投票
1 回答
258 浏览

opengl - Opengl未能正确进行深度测试

我正在开发一个非常简单的体素类游戏,但由于某种原因,OpenGL 没有正确进行深度测试。

以下是相关代码:

确保包括这是窗口初始化:

这是一个屏幕截图:

呈现此代码的结果。

我已经尝试禁用照明功能,但是无论如何都很难分辨出什么是最重要的。我已经尝试禁用剔除,除了球体之外什么都没有渲染,这让我认为问题可能出在glutSolidSphere函数而不是我的代码中。我正在使用 OpenGL 2.3。

0 投票
1 回答
11225 浏览

optimization - DirectX 11 中的早期 Z 测试/深度测试

作为一个 DirectX 菜鸟,我正试图围绕深度缓冲区,特别是如何为模糊像素调用像素着色器。

据我了解,光栅化器为覆盖绘制的原始蜜蜂的每个像素调用像素着色器,然后在输出合并阶段的后期,输出合并检查深度缓冲区并丢弃、写入或混合后台缓冲区中的像素.

如果我在一个非常复杂的对象之前渲染一个简单的不透明对象,这似乎很浪费,所以在调用复杂对象的像素着色器之前让光栅化器检查深度图似乎很有用。

在进行研究时,我发现了对早期 Z 测试/保守 Z 测试等的参考,但似乎也很少有关于它的文档。我寻找一种方法来在光栅化状态 desc 对象上配置它,但我只在 OM 状态 desc 上找到了类似的东西。

似乎这也可以在 DX9 中使用 SetRenderState 进行设置(不过我也没有使用 DX9 的经验)

根据我的研究,如果我从前到后渲染对象,这似乎是某些硬件所做的事情,对吗?我怎么能说出来?有了所有 Control DirectX 给你的东西,你似乎无法控制它,这似乎很奇怪,因为它似乎是一个很好的优化 :)

对此的任何信息或参考资料均已适用

0 投票
1 回答
262 浏览

opengl-es-2.0 - OpenGL ES 2.0 GPU 加速几何排序

我有一个当前使用 OpenGL ES 1.1 的 3D 应用程序,大多数网格在应用程序中是硬连线的并且是静态的(它们不会移动),因此深度测试允许使用硬连线排序有效地绘制透明几何图形。

现在我想从 3D 编辑器加载世界,并添加一些透明的动态对象(几何可以是任意顺序),这会导致深度测试从后面在几何中绘制“洞”,即正在渲染在前面使用OpenGL ES 1.1 深度测试几何之后。

我很快就会迁移到 OpenGL ES 2.0,所以我想知道是否有 GPU 加速排序来在背面绘制几何图形,以便以正确的方式进行混合。

0 投票
1 回答
380 浏览

opengl - 立方体的照明和表面法线问题

在此处输入图像描述

在我尝试使用 glnormal 进行照明后,我的立方体看起来像这样(房子)。如果我摆脱 glnormal 那就很好,如果我要摆脱 glDepthFunc(GL_ALWAYS); 然后就好了,不知道这是怎么回事。

还有另一个问题,在我使用 glDepthFunc(GL_ALWAYS); 之后,我尝试添加其他东西,我将 z 轴坐标转换为房子后面,但我仍然看到它?我误解了深度测试吗?

最初设定

绘制立方体的函数

0 投票
0 回答
128 浏览

rotation - 在 Direct3D9 上切割的旋转立方体

我试图在 Direct3D9 上显示一个旋转的立方体。我可以成功绘制它,但是在旋转过程中没有绘制一些像素。我想在旋转过程中展示立方体的每个部分。每个面的大小为 0.5f,并且从点 0、0、0 随 Pitch Yaw Roll 旋转。我尝试禁用 Z 缓冲区或设置视口的高 Z 值但没有成功。有什么建议吗?哦,我正在以线框模式渲染它。 剪切图像

编辑:我确认问题出在 Z 缓冲区上。我试图在 Z 轴之间平移立方体,很明显视图在 0.0 和 1.0 之间,但 SetViewport 并没有改变它,我不明白为什么......

编辑:如果我禁用 ZBUFFER,顶点仍然会被切割。我尝试使用参数 (m, 90, 800 / 480, -0.1, 100) 使用 此实现 ( http://pastebin.com/EVCRG6f7 ) 设置一个新的投影矩阵,但问题仍然存在。剪切图像 2

编辑:我尝试使用 OpenGL 使用在 Direct3D9 上使用的相同顶点和视图矩阵,并且我的立方体正确绘制。我用这些值初始化它:

0 投票
1 回答
433 浏览

java - LWJGL FBO - 深度测试不起作用(更简单的代码)

当我渲染到 FBO 时,深度测试似乎失败了,但当我不这样做时,它的效果很好。不过,奇怪的是,在更复杂的版本上(我没有测试过这个),当我在学校电脑上测试它时(当然不是我应该工作的时候!:-)),即使没有 FBO,它仍然失败。

不幸的是,我在这个网站上没有足够的声誉来张贴图片,所以我将把它作为链接发布在这里。(这个比较复杂,但是效果还是一样的(反正彩色立方体的渲染和这个版本一样))。

最后,代码如下:

主.java:

请注意,我留下了几个包装器 - Camera 和 CamController - 它们只允许您使用 glTranslate() 和 glRotate() 移动

0 投票
1 回答
291 浏览

c++ - 深度测试的奇怪结果

当我在渲染我的对象时启用 GL_DEPTH_TEST 时遇到问题,会发生以下情况:

在此处输入图像描述

GL_CULL_FACE 在那个上是禁用的。

它只发生在透视图上!有没有人知道发生了什么?

我为此使用 Qt 4.8。

当然,如果我禁用深度测试,它看起来很好,但是对象以错误的方式覆盖,正如预期的那样。

更新

我用这个创建我的投影矩阵:

其中宽度和高度与视口大小有关。

这是我绘制场景的代码:

简而言之,我首先根据相机朝向的位置绘制网格,以便提供类似于 Blender 的功能。然后,我绘制所有对象。我正在使用索引 VBO 来实现这一点。

我还在 CCW 中绘制它们,我 99% 确定三角形是以这种方式传递给 OpenGL 的。

0 投票
1 回答
132 浏览

windows-runtime - 通过深度测试绘制地形?

我正在尝试在不平坦的地形上渲染几何形状(从高度图加载/形状几何也是基于高度图的平均高度生成的,但它们并不完全适合它)。我有以下问题 - 有时地形会通过图片上显示的形状显示。

打开图片

我需要在启用深度测试的情况下绘制地形和形状,这样它们就不会阻碍场景中的其他对象。有人可以提出一个解决方案来确保形状始终呈现在顶部吗?把它们抬起来并不是真的可行......我需要替换地形上实际像素的颜色,而在像素着色器中这样做似乎太昂贵了..

提前致谢

0 投票
1 回答
741 浏览

c++ - GL_DEPTH_TEST 在 OpenGL 3.3 中不起作用

我正在使用 OpenGL 3.3 编写一个简单的渲染程序。

我的代码中有以下几行(应该启用深度测试和剔除):

但是渲染后我看到以下结果:

花坏深度

如您所见,深度测试似乎不起作用。我究竟做错了什么?我应该在哪里寻找问题?

一些可能有用的信息:

  • 在投影矩阵中,我将近裁剪平面设置为 0.2,远设置为 3.2(因此近平面不为零)。
  • 我使用带有 glDrawArrays 的简单方法和顶点和纹理坐标的两个缓冲区来渲染网格和纹理。用于正确显示这些数组的着色器。
  • 我不计算和绘制法线。
  • 上下文创建代码: http: //pastebin.com/mRMUxPL1

更新:

终于让它工作了!事实证明,我没有为深度渲染创建缓冲区。当我替换此代码(缓冲区初始化)时:

有了这个:

一切开始正常!