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

javascript - Three.js / WebGL - 透明平面隐藏在它们后面的其他平面

当您在 Three.js / WebGL 中有两个平面并且其中一个或两个都是透明的时,有时后面的平面会被上面的透明平面隐藏。为什么是这样?

0 投票
2 回答
597 浏览

actionscript-3 - AS3:Z 缓冲

与 z 排序相比,Z 缓冲是一种更好的渲染技术,因为它可以渲染相交的 3D 对象。

说,我有一个Array包含两个Object实例如下:

这是两个Object实例,每个实例包含三个Vector3D实例,代表三角形的三个顶点。

我将使用Matrix3D.transformVector()Vector3D.project()绘制具有graphics舞台属性的三角形。

在没有创建任何精灵的这种情况下,如何使用 Z 缓冲来绘制每个像素?

0 投票
3 回答
698 浏览

xna - XNA 4.0 和无法解决的(我)深度好奇渲染

XNA 4.0 上关于深度问题的大头疼:

在此处输入图像描述


我已经找到了许多类似问题的答案,但没有一个适合我......

设备设置如下:

作为一个残酷的问题解决者,我尝试了大多数 DepthStencilFormat 和 DepthStencilState 的可能性......没有人像我想要的那样工作。

关于投影矩阵,我也尝试了许多近剪辑和远剪辑值。(立方体宽度:10f)但无法得到正确的结果。

我已经用许多不同的纹理对此进行了测试,所有这些都是不透明的。

我不使用BasicEffect,而是使用纹理+法线贴图的效果,这可能是问题的根源吗?

CubeEffect.fx

编辑:我尝试了 BasicEffect 并且问题是一样的......

所以...感谢您的帮助;)

0 投票
1 回答
2613 浏览

javascript - 为软件渲染器实现 z 缓冲的最快方法?

我正在实现一个 javascript 软件渲染器(用于学术目的)。它处理将 3d 对象表示为三角形,并处理从 3d 空间到 2d 空间的透视投影。

到目前为止,我使用 lineToandfillRect来表示屏幕上的顶点和线条。我什lineTo至曾经做过扫描线三角形填充。(你可以在这里查看项目)

到目前为止,FPS已经相当不错了。但任务的最后一部分是实现 z-Buffering :P。据我所知,这样做的唯一方法是停止使用填充我的三角形lineTo,并用 1px 线条数组或 1px 正方形数组填充它们。(因为在我绘制每个“像素”之前,我必须检查深度缓冲区,看看我是否应该实际绘制它。)

问题是,用小矩形或线条填充三角形很慢。将所有内容降至 2FPS。所以我的问题是,有什么方法可以绘制一个像素而不是一条细线(可能更快)?

或者,我还能做些什么来加快速度?我的目标是让它旋转得足够快以演示原理。(6-10fps就足够了)

干杯。

[编辑] 在等待答案的同时,我将继续修改我的三角形填充函数以绘制 4px 大小的“像素”而不是 1px。但这会看起来参差不齐...

0 投票
2 回答
2398 浏览

c++ - 我的 Z 缓冲区计算有什么问题?

我正在实现一个 Z 缓冲区来确定应该在一个充满三角形的简单场景中绘制哪些像素。我有一个三角形、一个顶点、一个向量(当然是数学的 (x, y, z) 类型)的结构表示,以及一个将单个像素绘制到屏幕上的函数。这是我拥有的结构:

不幸的是,当我扫描将我的三角形转换为屏幕时,它依赖于计算深度来确定可见和要绘制的内容,我得到了不正确/不切实际的 Z 值(例如,三角形中某个点的深度超出了所有 3 个顶点的深度范围)!我一遍又一遍地查看我的代码,无法弄清楚我的数学是否有问题或者我在某个地方有粗心的错误,所以我将尝试准确地展示我正在尝试做的事情,希望其他人可以看到一些我不。(而且我仔细研究过确保浮点值仍然是浮点值,我正确地传递了参数等等,所以这真的令人困惑!)

总的来说,我的扫描转换算法会像这样(伪代码)在扫描线上填充像素:

为了获得每条扫描线的 zInit 值,我考虑平面方程 Ax + By + Cz + D = 0 并重新排列它以获得 z = -1*(Ax + By + D)/C,其中 x 和 y 是分别作为跨扫描线的当前 x 值和当前扫描线值本身插入。

对于扫描线上的后续 z 值,我内插为 zk+1 = zk - A/C,其中 A 和 C 来自平面方程。

为了获得这些 z 计算的 A、B 和 C,我需要由vertex v[3]当前三角形的 3 个顶点(数组)定义的平面的法线向量。为了得到这个法线(我在代码中命名为 planeNormal),我定义了一个叉积函数:

为了获得平面方程/我的 z 计算的 D 值,我使用平面方程 A(x-x1) + B(y-y1) + C(z-z1) = 0,其中 (x1, y1, z1)只是平面中的一个参考点。我只是选择了三角形顶点 v[0] 作为参考点并重新排列:

Ax + By + Cz = Ax1 + By1 + Cz1 因此,D = Ax1 + By1 + Cz1

所以,最后,为了得到用于 z 计算的 A、B、C 和 D,我对每个三角形都这样做了,其中trianglelist[nt]是场景的整个三角形数组中当前索引 nt 处的三角形:

从这里,在我描述的扫描转换算法中,我计算了 zs:

唉,在所有这些仔细的工作之后,有些事情发生了!在某些三角形中,深度值是真实的(符号除外)。对于由顶点 (200, 10, 75)、(75, 200, 75) 和 (15, 60, 75) 给出的三角形,所有深度都为 -75。对于所有顶点都在相同深度的其他三角形,情况也是如此。但是对于顶点 (390, 300, 105), (170, 360, 80), (190, 240, 25),所有的 z 值都超过 300!第一个是 310.5,其余的只是变大,最大值在 365 左右。当最深的顶点位于 z = 105 时,不应该发生这种情况!!!那么,在所有的漫无边际,任何人都可以看到可能导致这种情况的原因吗?如果这是与符号相关的事情,我不会感到惊讶,但是在哪里(毕竟,绝对值在恒定深度情况下是正确的)?

0 投票
1 回答
2019 浏览

sprite - 在 Corona SDK 中控制 Z 深度的正确方法是什么?

在 Corona SDK 中控制 Z 深度的正确方法是什么?

看起来精灵本身并没有存储任何 Z 信息。

0 投票
1 回答
13802 浏览

glsl - gl_FragCoord.x, y, z 对于所有像素为 1,w 为深度

我正在使用带着色器的 THREE.js。我正在尝试获取 zbuffer 信息。

顶点着色器:

片段着色器:

场景中有不同位置的对象,因此 zbuffer 中的值应该不同。

奇怪的是gl_FragCoord.xgl_FragCoord.ygl_FragCoord.z似乎1.0适用于所有片段,而gl_FragCoord.w对于不同的片段似乎有所不同。

如果我使用gl_FragCoord.w

它似乎是 zbuffer 图像:

在此处输入图像描述

那么为什么gl_FragCoord.w要表示深度信息,而gl_FragCoord.z总是1.0针对所有片段呢?

0 投票
1 回答
2017 浏览

opengl - 为什么当我使用 glReadPixels() 读取 z-buffer 时 z-buffer 的值总是 0?

为什么当我使用 glReadPixels() 读取 z-buffer 时 z-buffer 的值总是 0?

0 投票
0 回答
383 浏览

opengl-es - Cocos2d 2.x:启用 z-buffering 和使用 vertexz

假设:我正在使用使用 OpenGL 2.0 ES 的 Cocos2D 2.0。

我的游戏有一张用于所有级别资产(例如背景、敌人、云)的精灵表,以及一张用于玩家角色精灵和 HUD 元素的精灵表(例如,通常两者都在其余资产之上的 z 级别)。这是因为我允许用户更改玩家精灵并且无法将所有资源都放在一个精灵表中。

我还将 CCSpriteBatchNode 用于两个精灵表和 pvr.ccz 压缩纹理文件。问题是,在某些情况下,我需要更改位于不同精灵表(关卡精灵表、玩家精灵表)中的某些资产(例如云、玩家、老板位置)的绝对 z 水平。

两个实际案例场景:

  • :我希望玩家去云层下方,因此动态改变玩家精灵的绝对z位置也相对于关卡资产精灵批处理节点。
  • :当关卡boss到达时,我想让boss飞到玩家上方(因此绝对z-level与玩家精灵z-level相比应该+1)。这似乎也需要启用 z 缓冲和使用 vertexz。

现在,我对如何做到这一点感到困惑,因为据我所知,每个精灵表都被认为是一个不同的节点,因此是一个不同的 OpenGL 调用(启用 z-buffering 和 vertexz 会降低我的性能需要更多调用吗?),并且是想知道是否有一些教程/参考可以帮助我和/或是否有人可以分享一些类似案例的经验

0 投票
2 回答
1935 浏览

c++ - 从 glm::project 输出计算 z-buffer

我想根据 glm::project 的输出计算对象位置的 z 缓冲区。下面代码中 z-buffer 的计算来自https://en.wikipedia.org/wiki/Z-buffering

我试过的

问题

无论我如何旋转模型或使用哪个点,zBufferValue 的值都是 1。根据 wiki 页面,该值应介于 -1(近平面)和 1(远平面)之间。

我在计算中做错了什么?