例如...

如果我正在开发的应用程序中需要多个纹理(基本上是唯一的sprites),我是否需要调用context3D.createProgram();并组装一个新的Program3D带有VertexShaderAssemblerFragmentShaderAssembler ))针对我希望在应用程序中使用的每个纹理?

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

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

有帮助吗?

解决方案

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

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

用法示例: 通用标签

我先绘制水,然后绘制地形,每一个都使用不同的着色器。 我的TerrainShader中有多个纹理,例如沙子,岩石和污垢的纹理。着色器决定在给定时间使用哪种纹理。例如。如果顶点的高度小于10,则使用沙子纹理。

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

我希望这会以正确的方式为您提供帮助。

其他提示

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

没有编写引擎,我无法告诉您通常如何完成。我想您将为不同类的模型,环境图等使用不同的Program3D对象。每个实体大概没有一个。您只能使用大约4000个Program3D对象。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top