我是3D开发的新手,目前正在使用Actionscript、Stage3D和AGAL来学习。我正在尝试创建一个具有简单的程序网格的场景,该网格是平面着色的。然而,我被困在如何将曲面法线传递到着色器以进行照明的问题上。我真的想为每个三角形使用一个单一的表面法线,并为每个三角形做平坦,甚至着色。我知道使用每个顶点的法线很容易获得更好的照明效果,但这就是我想要的效果。
由于着色器通常处理每个顶点,而不是每个三角形,我是否可以只传递每个三角形的单个法线,而不是每个顶点传递一个法线?我的想法是不是完全错了?如果任何人有一个简单的,平面着色的工作示例,我将非常感谢。
发布于 2013-01-19 17:23:55
我在这里挖掘了一个老问题,因为我通过谷歌偶然发现了这个问题,并且看到没有被接受的答案。
Stage3D的着色器引擎没有等效的"GL_FLAT“选项。这意味着片段着色器程序始终从三个相应顶点的输出中接收一个“变化”或插值的值(通过顶点程序)。如果想要平面着色,基本上只有一个选项:
为每个三角形创建三个唯一顶点,并将每个顶点的法线设置为三角形的面法线。这样,每个顶点将计算相同的光照,并产生相同的顶点颜色。当片段着色器进行插值时,它将插值三个相同的值,从而产生平面着色。
这太差劲了。每个三角形具有唯一顶点的要求意味着您不能在三角形之间共享顶点。这肯定会增加你的顶点数量,导致VertexBuffer3D上传过程中的延迟增加,以及整体较低的帧率。然而,我在任何地方都没有看到更好的解决方案。
https://stackoverflow.com/questions/12319822
复制相似问题