例如...
如果我正在开发一个需要多个纹理的应用程序(基本上是唯一的 Sprite ),我是否需要调用 context3D.createProgram();
并组装一个新的 Program3D
(带有 VertexShaderAssembler
和 FragmentShaderAssembler
)用于我希望在应用程序中使用的每个单独纹理?
Program3D
通常如何在引擎中工作?是一个程序运行整个事情,还是每个纹理、模型、使用一个程序 map ?
我是否正确地假设您只需要在初始化时间 (Event.ADDED_TO_STAGE
) 期间创建 Program3D
一次,而不是在每个帧期间 (事件.ENTER_FRAME
),对吗?
最佳答案
对于一个程序(着色器),您可以拥有多个纹理。通常,您为拥有的每个着色器编写一个程序。 例如,在我的游戏中,我有一个用于地形照明、纹理和着色的着色器(程序)。我有另一个用于水的着色器(程序)。
所以程序只制作一次,但我在绘制场景之前告诉 context3d 使用哪个程序。这样它将绘制我要使用当前程序绘制的任何内容。
使用示例:
context3d.setProgram(WaterShader);
water.drawTriangles();
context3d.setProgram(TerrainShader)
terrain.drawTriangles();
我首先绘制水,然后绘制地形,每个都使用不同的着色器。 我的 TerrainShader 有多个纹理,例如沙子、岩石和泥土纹理。着色器决定在给定时间使用哪个纹理。例如。如果顶点高度< 10,则使用沙子纹理。
因此,创建一次程序并在需要时使用它们。
我希望这能以正确的方式帮助您。
关于actionscript-3 - 在低级 AGAL 中编码时,是否需要为每个纹理创建一个新的 Program3D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829869/