2

例如...

如果我正在开发一个需要多个纹理的应用程序(基本上是唯一的精灵),我是否需要为我希望在应用程序中使用的每个单独的纹理调用context3D.createProgram();并组装一个新的Program3D带有 aVertexShaderAssembler和 a )?FragmentShaderAssembler

Program3D通常在引擎中如何工作?一个程序运行整个事情,还是每个纹理模型地图使用一个程序

我是否正确地假设您只需要Program3D在初始化时间 ( Event.ADDED_TO_STAGE) 期间创建一次,而不是在每个帧 ( Event.ENTER_FRAME) 期间创建一次,对吗?

4

2 回答 2

3

对于一个程序(着色器),您可以拥有多个纹理。通常你为你拥有的每个着色器编写一个程序。例如,在我的游戏中,我有一个用于地形照明、纹理和着色的着色器(程序)。我有另一个用于水的着色器(程序)。

所以程序只制作一次,但我在绘制场景之前告诉 context3d 使用哪个程序。这样,它将绘制我将要使用当前程序绘制的任何内容。

示例用法:

context3d.setProgram(WaterShader);
water.drawTriangles();

context3d.setProgram(TerrainShader)
terrain.drawTriangles();

我先画水,然后画地形,每个都使用不同的着色器。我的 TerrainShader 有多种纹理,例如沙子、岩石和泥土纹理。着色器决定在给定时间使用哪个纹理。例如,如果顶点的高度 < 10,则使用沙子纹理。

因此,只需创建一次程序并在需要时使用它们。

我希望这能以正确的方式帮助你。

于 2011-11-15T11:36:48.927 回答
1

您不需要为每个纹理创建一个新的 Program3D。每当您调用 drawTriangles() 时,渲染器都会使用最后一个程序集。如果您需要以不同的方式处理特定纹理,从而需要不同的片段着色器,那么您确实需要多个 Program3D 对象,但在极少数情况下,您需要为每个对象和纹理使用不同的着色器。

由于没有编写引擎,我无法告诉您通常如何完成此操作。我认为对于不同类别的模型、环境贴图等,您会有不同的 Program3D 对象。每个实体可能没有一个。您只能使用大约 4000 个 Program3D 对象。

是的,您应该提前创建和初始化 Program3D 对象。在渲染期间,您调用 Context3D.setProgram() 来指定活动程序。该程序用于渲染,直到您更改它。

于 2011-10-20T16:34:01.103 回答