Actionscript 使用Stage3D/AGAL的简单平面着色

Actionscript 使用Stage3D/AGAL的简单平面着色,actionscript,3d,stage3d,agal,Actionscript,3d,Stage3d,Agal,我对3D开发比较陌生,目前正在使用Actionscript、Stage3D和AGAL进行学习。我试图创建一个简单的程序网格,是平面着色的场景。但是,我一直坚持到底应该如何将曲面法线传递给用于照明的着色器。我真的很想只为每个三角形使用一个曲面法线,并为每个三角形做平面,甚至着色。我知道用每个顶点的法线很容易获得更好的照明效果,但这就是我想要的外观 因为着色器通常处理每个顶点,而不是每个三角形,所以我是否可以只对每个三角形传递一个法线,而不是每个顶点传递一个法线?我的想法完全偏离了吗?如果有人能提供

我对3D开发比较陌生,目前正在使用Actionscript、Stage3D和AGAL进行学习。我试图创建一个简单的程序网格,是平面着色的场景。但是,我一直坚持到底应该如何将曲面法线传递给用于照明的着色器。我真的很想只为每个三角形使用一个曲面法线,并为每个三角形做平面,甚至着色。我知道用每个顶点的法线很容易获得更好的照明效果,但这就是我想要的外观


因为着色器通常处理每个顶点,而不是每个三角形,所以我是否可以只对每个三角形传递一个法线,而不是每个顶点传递一个法线?我的想法完全偏离了吗?如果有人能提供一个简单、平面着色的工作示例,我将不胜感激。

我在这里挖掘一个老问题,因为我在谷歌上偶然发现了这个问题,并且发现没有公认的答案

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

为每个三角形创建三个唯一的顶点,并为其设置法线 每个顶点都指向三角形的面法线。这样,每个顶点 将计算相同的照明并产生相同的顶点颜色。 当片段着色器插值时,它将插值三个片段 相同的值,导致平面着色


这太差劲了。每个三角形需要唯一的顶点,这意味着您不能在三角形之间共享顶点。这肯定会增加顶点数,导致VertexBuffer3D上载过程中的延迟增加,以及整体较低的帧速率。但是,我在任何地方都没有看到更好的解决方案。

着色取决于每像素法线,而每像素法线本身取决于您使用的插值方法。我不知道你在用什么技术,我只能给你一个提示。你想要的只是一个插值,它取每个像素的三角形顶点的平均值。好的,这很有意义。我认为现在的问题对我来说更清楚了:鉴于这是片段着色器处理法线的方式,如果我想要有平面着色(每个面一个颜色的着色,没有渐变),我需要确保三角形之间没有共享顶点吗?目前,我正在共享顶点。如果我复制顶点,使所有顶点都不共享,那么我可以确保每个三角形在每个顶点上都具有相同的法线,从而消除像素之间发生的任何插值。复制顶点会起作用,但是使用正确的插值是一种方法。如果您使用ALternativa引擎,您可以使用一些很酷的着色器尝试这个漂亮的库,除了所使用的插值方法,没有其他选择。来自Adobe自己的Program3d文档:“变化:在顶点和片段着色器之间传输插值数据。顶点程序中的变化寄存器应用为片段程序的输入。值根据与三角形顶点的距离进行插值。”请参阅下面我的帖子。