我对3D开发相对较新,目前正在使用Actionscript,Stage3D和AGAL来学习。我试图创建一个带有平面阴影的简单程序网格的场景。但是,我完全不知道应该如何将表面法线传递到着色器以进行照明。我真的想为每个三角形使用单个曲面法线,并为每个三角形做平坦,甚至阴影。我知道很容易实现每个顶点有法线的更好看的照明,但这就是我之后的样子。
由于着色器通常处理每个顶点,而不是每个三角形,我是否可以只为每个三角形传递一个法线,而不是每个顶点传递一个?我的想法完全不在这里吗?如果有人做过简单的平面阴影的工作示例,我会非常感激。
答案 0 :(得分:2)
我在这里挖掘了一个老问题,因为我通过谷歌偶然发现它并且可以看到没有接受的答案。
Stage3D的着色器引擎没有等效的“GL_FLAT”选项。这意味着片段着色器程序总是从三个相应顶点的输出(通过顶点程序)接收“变化”或插值。如果你想要平面着色,你基本上只有一个选项:
为每个三角形创建三个唯一顶点并设置法线 每个顶点到三角形的面法线。这样,每个顶点 将计算相同的光照并产生相同的顶点颜色。 当片段着色器进行插值时,它将插入三个 相同的值,导致平面阴影。
这太蹩脚了。每个三角形的唯一顶点的要求意味着您不能在三角形之间共享顶点。这肯定会增加您的顶点数,导致VertexBuffer3D上传期间的延迟增加以及整体帧速率降低。但是,我没有在任何地方看到更好的解决方案。