问题标签 [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.

0 投票
10 回答
11735 浏览

c++ - 如何在 C++ 中处理非常大的二维数组

我需要创建一个大小为 800x800 的 2D int 数组。但是这样做会造成堆栈溢出(哈哈)。

我是 C++ 新手,所以我应该做类似向量向量的事情吗?只是将二维数组封装到一个类中?

具体来说,这个数组是我在图形程序中的 zbuffer。我需要为屏幕上的每个像素存储 az 值(因此是 800x800 的大尺寸)。

谢谢!

0 投票
1 回答
3245 浏览

flash - Flash CS4 3D Sprite 旋转 Z 顺序问题

我怀疑这是一个数学问题,而不是一个闪光问题。简而言之,我有两个围绕它们共同中心点旋转的立方体。到目前为止,一切都很好。使用 appendTranslation 和 appendRotation 矩阵函数,我设法让两个立方体旋转正常。

问题是绘图顺序似乎对 Z 缓冲几乎没有影响。我已经设法正确地 Z 缓冲区并按深度顺序排列立方体。然而,尽管绘制顺序正确,但 cueb 仅在一半时间被正确遮挡。

想象在 x 轴平面上有两个立方体,两边以相等的间距围绕 Y 轴旋转。在 90 度时,一个立方体将遮挡另一个,反之亦然,在 270 度旋转时。我的问题是这仅在这些地方之一正确发生。这似乎是一个符号问题,因为向后旋转(因此 -90 和 -270)仅在相反的位置具有相同的效果。

以下是相关代码:

PixelCubeGroup.as - 每次循环调用 Rotate

PixelCube.as 被绘制和旋转的东西

我设法将范围缩小到翻译行。在没有平移的情况下执行两个立方体的旋转可以正常工作并且尊重绘图顺序,而这不是。我怀疑流氓 Z Value 正在某个地方进入那里。

0 投票
1 回答
250 浏览

text - 为什么在使用 D3DXFont::DrawText 时重复的文本被渲染到不同纹理的 Z 缓冲区?

我已经为此绊倒了一段时间,想知道是否有人以前遇到过这个问题。

我正在处理的应用程序分为多个数据图和屏幕底部的单个时间线。每个绘图(实际上是多个相互叠加的纹理)以及时间线都被渲染为单独的纹理。首先渲染时间线纹理,然后是从屏幕顶部到底部的每个绘图纹理。我正在使用 DXUT 和 DirectX9(2009 年 3 月)。

将时间文本添加到时间线纹理后,我注意到文本在每个数据图的标题栏中重复出现。这是显示部分的屏幕截图,它只显示一个图,但文本在每个打开的图上重复:

替代文字

似乎它直接与在时间轴的渲染函数中调用的 DrawText 相关联。我确实使用相对坐标作为传递给 DrawText 的矩形,但由于我已经将渲染目标设置为所需的纹理,它应该只影响当前纹理。不是之后渲染的每个纹理。

有没有人在使用 D3DXFont 时遇到过类似的问题?

编辑:经过更多实验,看起来它与 Z 缓冲区有关。通过将 D3DCLEAR_ZBUFFER 添加到每个纹理表面上的清除,重复的文本就消失了。虽然这个问题现在似乎被绕过了,但我仍然很好奇为什么在我的 DrawText 调用期间要写入一个完全独立的纹理的 Z 缓冲区。

0 投票
3 回答
5142 浏览

c++ - 透视正确的纹理映射;z 距离计算可能有误

我正在制作一个软件光栅化器,但我遇到了一些障碍:我似乎无法让透视正确的纹理映射工作。

我的算法是首先对要绘制的坐标进行排序y。这将返回最高点、最低点和中心点。然后我使用 delta 穿过扫描线:

order[0]->y然后我们从to渲染order[2]->y,将x_startandx_end增加一个增量。渲染顶部时,增量是x_delta[0]x_delta[1]。渲染底部时,增量是x_delta[0]x_delta[2]。然后我们在扫描线上的 x_start 和 x_end 之间进行线性插值。UV 坐标以相同的方式进行插值,按 y 排序,从 begin 和 end 开始,每一步都应用 delta。

这很好用,除非我尝试进行透视正确的 UV 映射。基本算法是对每个顶点取UV/z和并在它们之间进行插值。1/z对于每个像素,UV 坐标变为UV_current * z_current。然而,结果如下:

替代文字

反转的部分告诉您增量的翻转位置。如您所见,这两个三角形似乎都朝向地平线上的不同点。

这是我用来计算空间中某个点的 Z 的方法:

我是对的,是 az 缓冲区问题吗?

0 投票
1 回答
2453 浏览

directx - 对于没有法线数据的三角形网格,我如何设置 DirectX 9 以关闭背面剔除、打开 z 缓冲和 gouraud 着色工作?

我一直难以确定 PresentParameters 和 DirectX 设备的正确参数,因此可以同时使用顶点级 gouraud 着色和使用 az 缓冲区。一些三角形网格工作正常,其他的背景三角形出现在靠近相机的三角形前面。

在这里可以找到一个示例:http: //gallery.me.com/robert.perkins/100045/zBufferGone。输入数据是构面中顶点的简单列表。每个面的顶点的缠绕顺序是不确定的(来自各种 CAD 软件导出功能)并且没有法线数据。

现在正在按如下方式设置 PresentParameters。我意识到这是 C# 而不是 C++,但我认为它足够具有描述性,并且参数传递给 C++ 代码。这会产生图片中的图像;参考设备上的行为相同:

我的所有其他设置尝试,即使在参考设备上,也会返回 COM 错误代码({“D3DERR_INVALIDCALL:无效调用 (-2005530516)”})。正确的设置参数是什么?

编辑:与 DirectX9 接口的 C++ 类设置默认值如下:

0 投票
2 回答
2289 浏览

directx - 在 DirectX 9 中,如何让 zbuffer 正常工作?

我在打开阴影以正确显示的情况下获得简单的立方体几何体一直没有成功。

这是 C# 代码,但值通过 SlimDX 直接传递给 C++ 代码。

... 是 PresentParameter 结构中用于设置我的 Direct3D9Device 对象的值。

在渲染过程中,SetRenderState 被调用如下:

同样,这被传递给 C++ 代码,它将值编组到 C++ 程序员不会担心的调用中。

图元是漫反射彩色顶点 (D3DFVF_XYZ | D3DFVF_DIFFUSE)。线框视图如下所示: 线框视图 http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

较近的一对较大的三角形是立方体的近面。

填充视图如下所示: 全视图 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

或者,在随后的渲染调用中: 全视图 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

我不知道如何解决这个问题。我应该从哪里开始寻找?

编辑:其中一帧的相机投影矩阵看起来像这样:

而且,视图矩阵如下所示:

0 投票
1 回答
350 浏览

c# - 切换视图和投影矩阵后,DirectX 网格无法正确显示

在我的程序中,网格被正确显示,但是当我将 device.transform.view 和 device.transform.projection 矩阵从左手系统更改为右手系统时,网格不再正确显示,即背面脸部被照亮,正面是透明的!有谁知道需要更改哪些内容才能获得正确的显示

原始矩阵:

修改:

0 投票
1 回答
3374 浏览

c++ - DirectX 深度缓冲不起作用

出于某种奇怪的原因,我的深度缓冲区不起作用,即后来绘制的三角形总是重叠,无论它们的位置如何。

我有这些演示者参数

这些渲染状态:

编辑:感谢您的回复。这是渲染代码代码:

Model::Draw()代码是这样的:

wherevertexBufferindexBufferwith 是类的属性。

以下是一些屏幕截图(FU,垃圾邮件保护):

1)http://img822.imageshack.us/img822/1705/dx2010080913182262.jpg这是情况

2)http://img691.imageshack.us/img691/7358/dx2010080913183790.jpg这是立方体在前面时的(正确)视图(立方体稍后绘制)

3)http://img340.imageshack.us/img340/4720/dx2010080913184509.jpg但是当我前面有截断的金字塔时,立方体仍然重叠

当你自己移动相机时更容易看到......

0 投票
1 回答
1365 浏览

opengl - 使用 OpenGL 实现 Z 缓冲区

对于一个项目,我想实现我自己的 Z 缓冲区。我知道算法以及如何实现它。因为我不想编写我计划使用 OpenGL 的整个图形引擎,所以问题是,如何将我自己的算法与 openGL 结合起来?

我在某处读到我可以自己计算所有内容,然后将每个像素的数据传递给 GLDrawPixels() 但这似乎有点矫枉过正。关键是我不想实现三角测量算法等。

我的目标是使用 openGL 直到线框,然后使用我自己的 z-buffer 算法,然后再次使用 openGL 绘制最终图片。(对于我的项目,z-buffer 是唯一重要的东西,包括光线和阴影)。有没有办法可以做到这一点,还是我必须自己实现所有内容并让openGL画出最终结果?

真挚地

0 投票
1 回答
758 浏览

java - 在 Java 3D 场景中绘制清晰的健康条

因此,我正在开发 Java 3D 游戏,并且正在实现悬停在单位上方的健康栏。

我首先在单元位置上方的 3D 点绘制一个四边形,并应用广告牌行为使其始终面向相机。

但我遇到的问题是健康栏有时会被其他风景遮住。

所以我正在考虑以下选项:

  1. 覆盖健康栏像素的 Z / 深度缓冲区值,以使渲染器认为它们比之后渲染的任何东西更靠近相机。

    我试过了renderingAttributes.setDepthTestFunction(RenderingAttributes.ALWAYS)。虽然它使渲染器在之前在同一区域中绘制的任何东西上绘制健康条,但当稍后在健康条顶部绘制其他风景时,它并没有帮助。

    在 Java 3D 中有没有更好的方法来做到这一点?

  2. 将生命值条的 3D 位置投影到摄像机前面的 2D 平面上。听起来可行,但在我着手重新发明所需的所有数学之前,也许有人可以指出一个现有的解决方案。

  3. 从 Java 3D 切换到 LWJGL 或 jMonkeyEngine 之类的东西(不仅针对此问题,还针对 Java 3D 已死的一般抱怨等)。虽然我什至不确定它们是否更灵活地解决这个特定问题。根据我的阅读,游戏开发中最严重的错误之一是在开发中期切换引擎。