【问题标题】:Simple flat shading using Stage3D/AGAL使用 Stage3D/AGAL 的简单平面着色
【发布时间】:2012-09-07 14:11:33
【问题描述】:

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

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

【问题讨论】:

  • 着色取决于每像素法线,这本身取决于您使用的插值方法。我不知道你用的是什么技术,我只能给你一个提示。你想要的只是一个插值,它为每个像素取三角形顶点的平均值。
  • 好的,有道理。我认为这个问题现在对我来说更清楚了:鉴于这是片段着色器处理法线的方式,如果我想要平坦的阴影(每张脸一个颜色的阴影,没有渐变),我需要确保我的顶点都没有在三角形之间共享?就目前而言,我正在共享顶点。如果我复制顶点所以没有共享,那么我可以确定每个三角形在每个顶点上都有相同的法线,从而消除了跨像素发生的任何插值。
  • 复制顶点是可行的,但使用适当的插值是可行的方法。
  • 如果你使用 ALternativa 引擎,你可以试试这个带有一些很酷的着色器的漂亮库alternativa 3D materials
  • 所使用的插值方法别无选择。来自 Adob​​e 自己的 Program3d 文档:“Varying:在顶点和片段着色器之间传输插值数据。来自顶点程序的不同寄存器用作片段程序的输入。值根据与三角形顶点的距离进行插值。 " 请看我下面的帖子。

标签: actionscript 3d stage3d agal


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多