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

unity3d - 反向深度蒙版着色器

我正在 Unity3D 中开发。

使用此处定义的深度蒙版着色器,不绘制使用该着色器的蒙版后面的对象(仅绘制蒙版前面的对象)。使用引用的代码,我尝试创建一个反向深度蒙版,旨在使相机仅在其后面绘制对象

我所做的是改变

进入

我也试过

但是,相机会绘制所有对象,无论是在蒙版后面还是前面。如何实现反向深度蒙版?

0 投票
1 回答
732 浏览

javascript - 三.js中网格的renderDepth似乎被忽略了

我想在其他一切之上渲染一个网格,这个解决方案工作正常: Three.js - Geometry on another

我想知道使用mesh.renderDepth 是否可以实现相同的目标,但到目前为止我还无法让它发挥作用。似乎 renderDepth 只有在 material.depthTest 或 depthWrite 设置为 false 时才有效,但是同一对象中的深度排序当然是错误的:http: //jsfiddle.net/SF9tX/22/

0 投票
2 回答
1765 浏览

c++ - OpenGL 深度缓冲区的行为不符合预期

我一直在研究用于教育追求的引擎的开端,并且遇到了一个我认为我理解的 OpenGL 概念,但是我无法解释我一直在观察的行为。问题在于深度缓冲区。另外,请理解我已经解决了这个问题,并且在我的帖子末尾我将解释是什么解决了这个问题,但是我不明白为什么通过我的解决方案解决了这个问题。首先我初始化 GLUT & GLEW:

然后我初始化我的程序(为了可读性和缺乏相关性而忽略了段):

除此之外的任何事情都只包括初始化各种引擎组件,加载 .obj 文件,初始化 ModularGameObject 类的实例,将网格附加到它们,没有涉及任何相关的 glut/glew。但是,在我继续之前,指定以下值可能很重要:

这导致我的视​​口遵循右手坐标系。似乎与问题有关的最后一段代码是我的顶点着色器:

此代码会导致正确完成所有转换和正常计算(不包括在内),但是我的模型的每一面都在不断地争取超越所有其他人。唯一一次我没有问题是站在第一个正在绘制的模型里面,然后什么都没有闪烁,我可以看到 Suzanne 的头部内部,就像我应该能够看到的那样。

在尝试了我能想到的任何事情几周后,我终于找到了一个解决方案,该解决方案仅涉及更改/添加两行代码。首先,我将这一行添加到我的顶点着色器的主函数的末尾:

这行代码的添加导致 z-fighting 的每一点都消失了,除了现在深度缓冲区完全向后,更远的顶点被可靠地绘制在前面的顶点之上。这是我的第一个问题,为什么这行代码会导致更可靠的行为?

现在我有了可靠的行为并且不再进行深度战斗,这是一个颠倒绘制顺序的问题,因此我将对 glDepthRange 的调用更改为以下内容:

我假设 glDepthRange(0.0f, 1.0f) 会导致靠近我的 Z_NEAR (-0.1) 的对象更接近 0,而靠近我的 Z_FAR(-1000) 的对象更接近 1。然后,让我的设置为 GL_LESS 的深度测试非常有意义,事实上,无论我的 Z_NEAR 和 Z_FAR 是什么,都应该是这种情况,因为 glDepthRange 映射值的方式,如果我没记错的话。

不过我一定是误会了,因为这条线的变化意味着离我更近的对象将在深度缓冲区中存储一个更接近 1 的值,而更远的对象将具有 0 的值,从而呈现向后的绘制顺序——但它确实像一个魅力。

如果有人能指出我的假设为什么是错误的方向,以及我可能没有考虑到我对 glsl 和深度缓冲的理解的方向。在我完全理解它的基础的功能之前,我宁愿不继续我的引擎的进步。

编辑: 我的_cameraPerspective矩阵的内容如下:透视矩阵图

其中 AspectX 为 16,AspectY 为 9。焦距默认为 70,但是添加了控件以在运行时更改此设置。

derhass 指出,这并不能解释着色器如何考虑传递给 glOrtho() 的任何信息。由于不使用标准管道和矩阵堆栈,视口尺寸与 _inverseScreenDimensions 一起考虑。这是一个包含 [1/X_RIGHT, 1/Y_UP, 1/Z_Far, 1] 的 vec4。或者因为缺少变量名,[1/1000, 1/1000, -1/1000, 1]。

在我的顶点着色器中将屏幕坐标向量乘以它会导致 X 值介于 -1 和 1 之间,Y 值介于 -1 和 1 之间,Z 值介于 0 和 1 之间(如果对象在它的相机前面一个负 z 坐标开始),和一个 1 的 W。

如果我没记错的话,这将是达到“设备坐标”的最后一步,然后是绘制网格。

请记住最初的问题:我知道这不是简化的,我知道我没有为此使用 GLM 或所有最常用的库,但是我的问题不是“嘿,伙计们解决这个问题!” 我的问题是:为什么我所做的更改会解决这个问题?

0 投票
0 回答
1330 浏览

c# - OpenGL帧缓冲区深度缓冲区不起作用

我正在尝试创建一个带有颜色和深度缓冲区的帧缓冲区对象。颜色缓冲区工作正常,但深度缓冲区不行。

问题不太可能出在场景绘制例程中,因为它在使用默认帧缓冲区时工作正常。禁用深度测试时场景会绘制一些东西,但启用深度测试时场景不会绘制。我只能得出结论,创建深度缓冲区并将其附加到帧缓冲区的方式存在问题。帧缓冲区已成功创建,我尝试了许多不同的深度缓冲区格式以及等效的渲染缓冲区,但这些更改似乎都没有任何区别。

我确实尝试使用 glReadPixels 读取深度缓冲区的像素。它似乎有一些变化,表明场景正在成功写入深度缓冲区。

以下是创建帧缓冲区的代码。还有什么我可以尝试修复或帮助我进一步调试问题的吗?也许需要为自定义帧缓冲区设置一些东西,但不是默认设置?

0 投票
1 回答
7427 浏览

opengl - OpenGl alpha test - How to replace AlphaFunc deprecated?

I'm trying to draw sphere with alpha, but I have a problem with my Z-buffer. Some pixels are transparent but write in the Zbuffer so a pixel opaque just behind is hidden.

Here are my settings:

I know the function glAlphaFunc(GREATER, aFloat) and enable(ALPHA_TEST) can do that but I read that it's a deprecated function since 3.1 version of OpenGL. How can I do a correct render without using ALPHAFunc? Does someone know a trick, or a way to do this via shaders?

0 投票
1 回答
522 浏览

c# - c#中的多边形深度排序

我正在用 c# 编写游戏,使用 opengl 即时模式渲染。很多时候,透明多边形由于排序不正确而无法正确显示。我一直在搜索,但找不到有关如何快速进行深度排序的教程。我的尝试方法是使用 List.sort 从相机计算每个透明三角形的深度,但这非常慢(每帧秒数,而不是每秒帧数)

有没有标准的深度排序方法?有没有关于如何做到这一点的 c# 好的教程?有没有快速的方法呢?

0 投票
2 回答
563 浏览

c++ - OpenGL:Radeon 驱动程序似乎与深度测试混为一谈

我在这里遇到了一个非常奇怪的深度测试问题。我在 Windows 上的 OpenGL 3.3 核心配置文件上下文中渲染一个简单的网格,启用了深度测试并将 glDepthFunc 设置为 GL_LESS。在我的机器上(带有 nVidia Geforce GTX 660M 的笔记本电脑),一切都按预期工作,深度测试正在工作,这就是它的样子:

在此处输入图像描述

现在,如果我在另一台 PC 上运行程序,一台装有 Radeon R9 280 的塔,它看起来更像这样:

在此处输入图像描述

奇怪的是,真正奇怪的是,当我在绘制之前每帧调用 glEnable(GL_DEPTH_TEST) 时,两台机器上的结果都是正确的。当我这样做时它正在工作,我认为在两台机器上都正确创建了深度缓冲区,当我在初始化时仅启用一次深度测试时,似乎在渲染之前以某种方式禁用了深度测试。这是可能成为问题一部分的最少代码:

在创建上下文并使其成为当前上下文之后,在初始化时调用的代码:

在缓冲区交换之前调用每一帧的代码:

使用上面的代码,我会在 Radeon 上得到错误的输出。注意:我使用 GLFW3 来创建上下文,使用 GLEW 来创建函数指针(显然 GLM 用于数学计算)。顶点数组对象包含三个属性数组缓冲区,分别用于位置、uv 坐标和法线。每一个都应该正确配置并发送到着色器,因为在每帧启用深度测试时一切正常。

我还应该提到,Radeon 机器运行 Windows 8,而 nVidia 机器运行 Windows 7。

编辑:根据要求,这里是用于加载网格和创建属性数据的代码。我没有创建任何元素缓冲区对象,因为我没有使用元素绘制调用。

.obj 加载例程主要改编自这个: http ://www.limegarden.net/2010/03/02/wavefront-obj-mesh-loader/

0 投票
1 回答
75 浏览

c++ - 我的管道将深度缓冲区渲染到纹理可能有什么问题?

据我了解,深度测试的主要步骤:1)启用深度测试以及我们希望如何进行深度测试 2)创建帧缓冲区对象并确保它具有附加的深度 3)绑定我们的帧缓冲区对象(确保在渲染之前清除它)4)绘制东西

那应该不是吗?我们的帧缓冲深度附件应该有深度数据吗?但我总是得到直 1 的默认深度清晰颜色

步骤1:

第2步:

.

第 3 步:

第4步:

这些不是步骤吗?
我错过了什么吗?
我尝试了一些不同的教程。
我无法获得任何深度来渲染纹理,我一遍又一遍地获得直线 1。

0 投票
2 回答
461 浏览

opengl - 我的 OpenGL 渲染深度几乎是 1,这是为什么?

我做一些基本的事情

1)计算我的位置
2)将其存储到“gl_Position”
3)然后我根据我的位置信息将我的深度存储到 vec2

vDepth 是我的着色器中的一个变量,我传递给我的片段着色器

在片段着色器中,我将片段深度存储在 gl_FragDepth

我的深度值都接近 1。我做错了什么吗?我可能会错过一个可以给我线性深度值的步骤吗?当我计算我的相机信息时,我的近端剪裁为 0.01,我的远剪裁为 200.0fi,需要近端在该剪裁空间附近。

0 投票
0 回答
372 浏览

c# - 您应该如何(经常)对您的 3d 对象进行深度排序?

提高 GPU 性能的常用方法是使用深度排序。您首先要绘制离您最近的对象(相机/视口),这样后面的每个片段(像素)都会被 Z-Buffer 提前处理。
如果是透明对象,您希望从后到前渲染它们,以保持正确的透明度。

我目前正在根据与相机/视口的距离对 CPU 上的每一帧 3d 对象进行排序。其中大约有 9000 个(可能很容易或多或少),因此从逻辑上讲,它对 CPU 的性能影响很大(有时不仅仅是在 GPU 上渲染未排序的 3d 对象)。我只有一个 3d 对象列表及其位置,没有花哨的空间分区或任何东西。

我正在使用包含每个对象的矩阵数据的实例缓冲区来渲染我的对象。

我的问题似乎很简单:

  • 我应该如何分类我的 3d 对象?在 CPU 上,还是在 GPU 上?如果我应该在 GPU 上对它们进行排序,该怎么做?
  • 我应该多久对我的 3d 对象进行一次排序?我应该每帧对它们进行排序吗?我应该通过每隔一帧对它们进行排序来进行权衡,还是每秒只对对象进行一次排序?

大多数 CPU 时间似乎都被距离数组排序所破坏,而不是自己计算距离......

一些示例代码(C#):

其中 MatrixDistance 是以下类: