gpt4 book ai didi

opengl-es-2.0 - OpenGL Sprite 场景,使用带透视投影且无失真的 z 缓冲区。可能的?

转载 作者:行者123 更新时间:2023-12-01 00:57:37 25 4
gpt4 key购买 nike

我正在开发一些基于 Sprite 的游戏。对于 z-ordering Sprite ,基本上有替代品
1) 按正确的顺序绘制 - 批处理可能会很麻烦
2) 使用正交投影和深度测试 - 半透明可能会很麻烦

我赞成 2) 但是我想保留透视投影以允许一些简单的 3d 动画。卡片在 3d 中翻转等。如果我这样做,z 缓冲区差异可能/将导致 Sprite 缩放,因为对象与相机的距离不同。
我考虑过根据 Sprite 的距离缩放 Sprite 以撤消投影。但是然后我会在当时的“非平面”2d 场景之上干扰 3d 动画对象。

我猜理智的方法是,去寻找一个正交的 2d 场景,然后在第二步中制作罕见的 3d 动画,并在其上放置“克隆”对象。但也许有人有不同的想法?



mikkokoos 的回答导致了解决方案。通过额外的深度值,顶点着色器可以调整裁剪空间中所有顶点的 z 坐标,以将它们推到不同的深度层。真正的 3d 坐标可以保持在 z=0。裁剪空间的变化消除了透视问题,因此场景中可以使用透视投影。
为了允许不同的相机角度而不只是垂直于 Sprite 平面,而不是将 Sprite 顶点推到固定层,他们应该通过“layerOffset * layerIdx”进行调整。因此,对于每一层,一个顶点都会被推得离相机更近一步。

注意:对于固定层,找出正确的剪辑空间坐标可能非常棘手,因为 xy 平面不一定位于中心。

开放性问题:剪辑空间的分辨率?剪辑空间中的最小坐标差异?插入的 Sprite 和真正的 3d 元素之间可能存在干扰?为了防止平面 Sprite 过度绘制 3d 对象,所有非 Sprite 平面对象都应该被最大使用层偏移量插入。从相机前面的可用空间计算层偏移可能是个好主意。

实现: Sprite 在透视投影的 3d 场景中的 2d 平面上组织。 Sprite 根据在着色器中计算的片段深度被遮挡。绘图仍然可以在纹理批处理中完成。

注 2:我仍然考虑进行两次分批绘制运行。第一个用于调整深度的 2d Sprite ,第二个用于 Sprite 或未“附加”到 Sprite 平面的对象。清除中间的深度缓冲区并添加一个不可见的 Sprite 平面以进行裁剪。 (如果舞台后面不允许有物体)
图片:
http://www.imagebam.com/image/109f6e356918267
http://www.imagebam.com/image/a2085f356918275

最佳答案

您可以使用透视投影来渲染所有 Sprite 并为每个 Sprite 设置一个统一的浮点“深度”,这将替换顶点着色器末尾的 gl_Position.z:

gl_Position.z=(u_zOffset-1.0)*gl_Position.w;

这将“压平”网格,因此如果您的网格更复杂并且取决于所使用的 DepthFunc,您可能需要一个范围。 (可见范围是从-1到1):

gl_Position.z=((1.0+(gl_Position.z/gl_Position.w))*u_zRange+u_zOffset-1.0)*gl_Position.w;

其中 u_zRange 是 2f/(number_of_layers),u_zOffset 是 u_zRange*layer_id。第 0 层是最近的。

编辑: 总结:通过 MVP 矩阵中的所有内容都与相机保持相同的距离,然后修改顶点着色器中的 Z 值以在屏幕上对它们进行排序。

关于opengl-es-2.0 - OpenGL Sprite 场景,使用带透视投影且无失真的 z 缓冲区。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26243692/

25 4 0
文章推荐: python - 如何从本地环境以编程方式运行 jupyter 笔记本(在 Sagemaker 笔记本内)
文章推荐: javascript - 脚本中的 Angular
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com