1

我对 3D 开发比较陌生,目前正在使用 Actionscript、Stage3D 和 AGAL 来学习。我正在尝试创建一个带有平面阴影的简单程序网格的场景。但是,我一直坚持到底应该如何将表面法线传递给着色器以进行照明。我真的很想为每个三角形使用一个单一的表面法线,并为每个三角形做平面,甚至着色。我知道通过每个顶点的法线来实现更好看的照明很容易,但这是我所追求的外观。

由于着色器通常处理每个顶点,而不是每个三角形,我是否可以只为每个三角形传递一个法线,而不是每个顶点一个法线?我的想法完全在这里吗?如果有人有一个简单的平面阴影的工作示例,我将不胜感激。

4

1 回答 1

2

我在这里挖掘了一个老问题,因为我通过谷歌偶然发现了它,并且可以看到没有可接受的答案。

Stage3D 的着色器引擎没有等效的“GL_FLAT”选项。这意味着片段着色器程序总是从三个相应顶点的输出(通过顶点程序)接收“变化”或内插值。如果你想要平面阴影,你基本上只有一个选择:

为每个三角形创建三个唯一的顶点,并将每个顶点的法线设置为三角形的面法线。这样,每个顶点将计算相同的光照并产生相同的顶点颜色。当片段着色器进行插值时,它将插入三个相同的值,从而产生平面着色。

这很蹩脚。每个三角形唯一顶点的要求意味着您不能在三角形之间共享顶点。这肯定会增加您的顶点数,从而导致 VertexBuffer3D 上传期间的延迟增加以及整体较低的帧速率。但是,我在任何地方都没有看到更好的解决方案。

于 2013-01-19T09:23:55.293 回答