问题标签 [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.
opengl - 如何从 Z 缓冲区获取 Z 值
我在 OpenGL 中绘图时遇到问题,我需要准确查看深度缓冲区中放置了哪些值。谁能告诉我如何检索这些值?谢谢克里斯
c++ - Z-Buffer 的高效实现
我目前正在使用 Z-Buffer 算法实现我自己的渲染器。一旦我完成了必要的计算(阅读:我的 Z-Buffer 填充了正确的值),我使用 SDL 为必要的像素着色。我为此使用了 HWSurface。
我的问题是,我怎样才能尽可能快地渲染它?我的意思是绘图本身,我可以对我的结构和算法进行优化,我稍后会这样做,但我想确保绘图本身尽可能快。
因为我有自己的 ZBuffer 实现(以后还会有其他算法)我不能使用 OpenGL,所以有什么替代方案吗?
现在,我只是检查 z 缓冲区中的所有点,并一个一个地绘制所有必须绘制的像素(因为它是 z 缓冲,所以我必须这样做,对吗?)然后我调用绘制像素方法。关于 SDL,我在通过 z 缓冲区之前锁定我的表面,绘制所有像素然后解锁它,据我所知,这不能更快。
有什么建议么?
c# - DirectX Z 缓冲区问题
有谁知道是什么导致了我在 C# Managed DirectX 应用程序中看到的奇怪工件。这是我遇到的问题的屏幕截图:
您正在查看的是一些地形,其下方有一个平面。
- 在左侧,您可以看到地形前面的飞机,即使它不应该是可见的(它在下面)
- 在中间有一个过渡阶段,你会看到我一直称之为“百叶窗”的东西
- 右侧显示正确
这一定是 Z-Buffer 问题,但我无法解决。有没有其他人遇到过同样的问题?它快把我逼疯了!
opengl - OpenGL Z 偏置(多边形偏移)限制
我有两个共面多边形。
我试着做。
并期望一个明显地“在”另一个之上。
直到大约 70-75 个单位外都是这种情况(近剪裁平面为 1,远剪裁平面为 10,000)。然后是一个大约 50 个单位的区域,其中存在 z-fighting,然后交替的多边形似乎出现在顶部。
多边形偏移是在正常 z 计算之前还是之后添加的?如果是在之后,我会认为它会在所有距离上“正常工作”。
我使用了错误的值吗?我误解了预期的结果吗?或者这应该可行,而且我可能在其他地方做错了什么?
我不敢尝试更大的值,因为场景中还有其他物体,如果数量足够大,它们也可以在远处“跳跃”到这些物体前面。
opengl - 使用 Z-Buffer 与根据深度对像素进行优先级排序的优势
这更像是一个学术问题。事实上,我正在准备考试,我只是想真正理解这个概念。
请允许我稍微解释一下上下文。手头的问题是在绘制到屏幕时将对象(或更具体地说是多边形)隐藏在彼此后面。需要进行计算以决定哪一个被最后绘制,因此被排在最前面。
在前几天我的一次讲座中,我的教授说根据像素的深度值对像素进行优先级计算在计算上是低效的。然后,他向我们简要介绍了 Z 缓冲区以及它们如何测试像素的深度值并将它们与缓冲区中像素的深度值进行比较。这与“根据深度优先考虑像素”有何不同。
谢谢!
directx - 更改 DirectX 9.0c 中预转换网格的深度缓冲区限制
我正在编写接收预转换顶点并将它们显示在屏幕上的小型应用程序。
顶点的 FVF 定义为(我无法更改)
Z 缓冲区是通过 D3DPRESENT_PARAMETERS 的字段创建的(这是可变的)
问题是我得到了非常短的远剪裁平面(每个网格都被剪裁在距相机 1.0f 的位置)。我不能使用矩阵投影(正如我所说,我已经得到了预变换的顶点)。有没有办法设置深度缓冲区限制?或者有没有其他方法可以在预变换的顶点上使用长远裁剪平面的 z 缓冲区?
opengl - gl_Position 的 Zbuffer 规则
这是我对opengl的设置,以防它们很重要:
有一段时间我认为剪裁平面将适用于 gl_Position.z 在 -1 到 1 之外的任何东西。但即使我在着色器中强制 gl_Position.z 为常数:
仍然存在基于 gl_Position.w 的正确 z 缓冲和裁剪!那么规则是什么?
direct3d - 如何在 DirectX 9.0 c 中访问像素着色器中的深度缓冲区
是否可以通过 DX 9.0c 中的像素着色器 2.0 访问深度缓冲区?我用谷歌搜索了一下,我发现的唯一解决方案描述了仅适用于 GeForce 6 和 7 的 GPU hack。
我想要实现的是编写景深着色器效果。我不能简单地抓取顶点的 Z 坐标,因为我也在渲染纹理技巧,用于其他后期处理。
编辑:
我试过这个:
SaveTextureToFile 失败,着色器获得纯白色 RGB(1, 1, 1) 的纹理
glsl - [GLSL]如何比较世界坐标中所有顶点的z值?
这可能是一个简单的问题。作为 GLSL 的新手,我宁愿在这里问。现在,在顶点着色器中,我可以通过以下方式获得世界坐标系中的位置:
问题是:现在我可以在所有顶点中获取 posWorld 的最大值/最小值吗?这样我就可以获得顶点深度的范围,但不能获得深度缓冲区的范围。
如果这是不可能的,我怎样才能得到世界坐标系中近/远平面的 z 值?
最诚挚的问候,
简
c - 关于优化 Z 缓冲区实现的建议?
我正在编写一个 3D 图形库,作为我项目的一部分,我现在一切正常,但还不够好。
特别是,我的主要头痛是我的像素填充率非常慢 - 在我的目标机器上绘制一个跨越 800x600 窗口一半的三角形时,我什至无法管理 30 FPS(这无疑是一台较旧的计算机,但它应该能够管理这个...... )
我在我的可执行文件上运行了 gprof,最后得到了以下有趣的行:
该函数vSwap
是我的双缓冲区交换函数,它还执行 vsyching,所以对我来说,测试程序将花费大量时间在那里等待是有意义的。grScanlineFill
是我的三角形绘制函数,它创建一个边列表,然后调用grInterpolateHLine
实际填充三角形。
我的引擎目前正在使用 Z 缓冲区来执行隐藏表面移除。如果我们忽略(假定的)vsync 开销,那么测试程序会花费大约 85% 的执行时间来清除深度缓冲区,或者根据深度缓冲区中的值写入像素。我的深度缓冲区清除功能本身很简单:将浮点数的最大值复制到每个元素中。功能grInterpolateHLine
是:
我真的不知道如何改进它,特别是考虑到这vSetPixel
是一个宏。
我对优化的全部想法已经缩减为一个:
- 使用整数/定点深度缓冲区。
整数/定点深度缓冲区的问题是插值可能非常烦人,而且我实际上还没有定点数库。有什么进一步的想法吗?任何建议将不胜感激。