问题标签 [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:我可以保存 Z 缓冲区数组值吗?
我是 MATLAB 新手,想知道是否有人可以帮助我解决这个(可能是基本的)问题:
我想查看/保存 3D surf() 的每个屏幕像素(z 缓冲区)的深度值,最好保存在文件中。我已经阅读了在 Matlab 中使用 OpenGL 来获取深度缓冲区,这很有帮助,但我似乎无法弄清楚如何保存缓冲区值,而不仅仅是将它们作为图像输出。
对此的任何帮助将不胜感激。
java - 在 3d 空间中渲染三角形面时检查深度/z
我的问题可以简化为:如果将 3d 三角形投影并渲染到 2d 观察平面,如何计算每个被渲染像素的 z 值以便存储到缓冲区?
我目前有一个可以工作的 Java 程序,它能够将 3d 三角形作为纯色渲染到 2d 视图,并且相机可以毫无问题地移动、旋转等,完全按照人们的预期工作,但如果我尝试将两个三角形相互叠加,靠近相机的一个会遮挡更远的一个,但情况并非总是如此。AZ 缓冲区似乎是解决此问题的最佳方法,存储我渲染到屏幕的每个像素的 z 值,然后如果有另一个像素试图渲染到相同的坐标,我将其与 z 值进行比较决定渲染哪个像素时的当前像素。我现在面临的问题如下:
如何确定我渲染的每个像素的 z 值?我想了想,似乎有几种可能。一种选择涉及找到面部所在的平面方程(ax + by + cz + d = 0),然后对正在渲染的三角形中的每个像素进行某种插值(例如,在 2d 渲染的三角形上沿 x 方向的一半-> 通过 3d 三角形的中途 x 方向,y 相同,然后使用平面方程求解 z),但我不确定这是否可行。我想到的另一个选择是迭代3d三角形的每个点,给定量子,然后使用该点的z单独渲染每个点(我也可能必须通过平面方程找到)。
同样,我目前主要考虑使用插值,所以伪代码看起来像(如果我的平面方程为“ax + by + cz + d = 0”):
pixel.x
被渲染的像素的 x 值在哪里2dtraingle.minX
,被渲染2dtriangle.maxX
的三角形(即其边界框)的最小和最大 x 值在被投影到 2d 视图后,并且它的最小/最大 Y 变量是相同的, 但对于它的 Y.3dtriangle.minX
和是 3d 三角形在投影到 2d 视图之前3dtriangle.maxX
的最小和最大 x 值, 是3d三角形所在平面的方程的系数,是对应的 z 值被渲染的像素。a, b, c, and d
z
这种方法行得通吗?如果有任何歧义,请在关闭问题之前在评论中告诉我!谢谢你。
c++ - 从深度传感器到OpenGL的z-buffer的数据实现遮挡
我想了解更多关于使用深度传感器(例如 kinect 或 Realsense RGB-D 开发套件)数据的增强现实应用程序中的遮挡。
我读到应该做的是将渲染对象的 z 缓冲区值与传感器的深度图值进行比较,并以某种方式掩盖这些值,以便只看到更接近用户的像素。有没有人有有什么资源或开源代码可以做到这一点或可以帮助我理解它吗?
更重要的是,我希望我的手(我检测为一个斑点)总是遮挡虚拟对象。难道没有更简单的选择吗?
c++ - 改变 OpenGL 的 z-buffer 的值
我想将具有深度值的矩阵传递到 openGL 的 z 缓冲区中。在某个地方我发现我可以使用glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());
其中 mat 是一个 opencv Mat。是否可以使用纹理绑定更改 OpenGL 中的 z 缓冲区值?如果可以,如何?
three.js - 在 three.js 中使用 renderOrder
我想在一个场景中有两个重叠的对象,但我想定义应该首先绘制哪个对象。我在这里有一个代码示例:http: //jsfiddle.net/sg02e5sm/1/
我正在使用renderOrder = 1
第二个对象使其始终显示在第一个对象的顶部(只要它们具有相同的 Z 值),但它不起作用。
three.js - THREE.JS:以正确的 z-indicies 渲染大而遥远的对象,并且仍然放大小对象
我有一个场景,我正在绘制(按比例)地球、月球和一些航天器。当月球被地球遮挡时,它并没有消失,而是仍然可见(通过地球)。
根据我的研究,我发现部分问题是我的相机的近距设置太小,如链接的文章中所述,z-sorting 中的近距值较小会导致四舍五入,以使非常远的物体变得糊涂。
这里的复杂性在于,当相机放大时,我需要有细粒度的 z 索引,以查看航天器(与地球相比,半径最大为 61 米的物体,重量为r =~ 6.5e+06 meters
)。为了使月球和地球规模的物体以正确的顺序渲染,近处必须至少为 100,000 m,此时我无法看到近处的物体。
一种解决方案是缩小比例以使用公里,但我不能失去这种精度,而是更喜欢使用米。
关于如何以正确的 z 索引渲染非常大的、遥远的物体,同时保持比例和放大小物体的能力的任何想法?
我的想法(我不知道如何实现):
- 更改 z 缓冲区以包含更多值和更高的分辨率?
- 将远处对象添加到使用“farCamera”渲染的“farScene”,该“farCamera”由特写相机上使用的相同控件控制?
c++ - Z-Buffer 的奇怪行为
我正在使用延迟着色方法来渲染场景,但是由于 Z-Buffer 的奇怪行为,我遇到了 Skybox 技术的问题。我创建了额外的帧缓冲区并附加了 5 个纹理,其中一个用作深度缓冲区。第一个通道是几何通道,它用所需的数据填充纹理,第二个通道渲染最终对象,并将纹理和闪电应用于主帧缓冲区,最后一个通道渲染天空盒。问题是 Skybox 被忽略(Z-Buffer 检查失败,因此它是不可见的)。
在渲染天空盒的时候,我将次帧缓冲区映射为GL_READ_FRAMEBUFFER,将主帧缓冲区(屏幕)映射为GL_DRAW_FRAMEBUFFER,所以可以使用次帧缓冲区的深度缓冲区,然后我将深度函数设置为GL_LEQUAL。只有当我将深度函数更改为 GL_GREATER(或 GL_ALWAYS)时,才能看到天空盒,但它是在对象之上渲染的。
顶点着色器:
模型矩阵是 Skybox 转换为相机坐标的产物。
glDepthFunction 设置为 GL_LEQUAL:
glDepthFunction 设置为 GL_GREATER:
Z缓冲区的内容:
更新1:我试过像这样使用glBlitFramebuffer:
但它不起作用。主深度缓冲区包含黑色像素数组。
更新 2:
天空盒缓冲区:
three.js - 如何仅使用 three.js 写入 zbuffer
我正在尝试使用 thee.js 来仅更新 zbuffer(我正在使用 preserveDrawingBuffer 来创建跟踪效果)。但是我找不到任何方法只使用标准材料写入 zbuffer,到目前为止我已经尝试过:
- 将材质设置
visible
为 false,这会停止对象渲染。 - 将材质设置
opacity
为 0.0,这意味着不会渲染任何内容。
是否有这样做的“标准”方式,还是我需要使用自定义片段着色器?
c# - Volume Ray Marching 始终呈现在其他对象之上
我有一个非常大的问题一直困扰着我这么久,我似乎无法找到解决方案。我已经下载了这个项目https://github.com/brianasu/unity-ray-marching/tree/volumetric-textures(Unitypackage 和我的项目在这里https://dl.dropboxusercontent.com/u/27758186/ApplicationVolume.unitypackage) ,那是关于体积渲染的。
问题在于,如您所见,体积总是呈现在其他所有事物之前(尝试将立方体放置在具有体积的立方体前面)。我尝试了很多东西,但似乎都没有。
我认为这可能是使用的着色器的问题。在主相机中,附加了一个 RayMarching 脚本,其中包含一个 OnRenderImage 方法,该方法创建一个新相机(尽管已禁用)并渲染体积。我不知道这是否是着色器问题,或者更像是相机问题(使用替换的着色器进行渲染)。我附上我当前的项目进行测试,这样你就不必从 git 下载,我只希望音量(头部)出现在矩形后面(看不到),当它实际上在后面时,在前面时,漂亮很像标准几何图形,但它总是出现在顶部......
任何帮助或建议将不胜感激,我有点绝望,因为任何事情都有效,我很确定这是一个相当简单的问题。
Ray Marching的shader代码如下。它是否应该进行某种 ZTesting 以不显示被任何其他对象覆盖的片段?
opengl - Opengl深度缓冲区到cuda
我是 Opengl 的新程序员,我的目标是将深度缓冲区检索到 FBO 中,以便能够在不使用 glReadpixels 的情况下传输到 cuda。
这是我已经完成的:
此代码使用正确的深度值创建我的 FBO。
根据文章“在 cuda 上使用不规则 z 缓冲区进行快速三角形光栅化”,现在出现了一个新问题。无法从 Cuda 访问附加到 FBO 的深度缓冲区。
这是文章的引述:
可以将纹理或渲染缓冲区附加到 FBO 的深度附加点以适应深度值。但是,据我们测试,CUDA 内核无法访问它们。[...] 我们设法使用了 FBO 上的颜色连接点。显然,在这种情况下,我们必须编写一个简单的着色器程序来将深度值转储到帧缓冲区的颜色通道中。根据 GLSL 规范 [KBR06],特殊变量 gl_FragCoord
这些陈述仍然正确吗?你建议我将深度缓冲区转储到颜色通道吗?到纹理?