Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在使用低级AGAL编码时,是否需要为每个纹理创建新的Program3D?_Actionscript 3_Textures_Fragment Shader_Vertex Shader_Stage3d - Fatal编程技术网

Actionscript 3 在使用低级AGAL编码时,是否需要为每个纹理创建新的Program3D?

Actionscript 3 在使用低级AGAL编码时,是否需要为每个纹理创建新的Program3D?,actionscript-3,textures,fragment-shader,vertex-shader,stage3d,Actionscript 3,Textures,Fragment Shader,Vertex Shader,Stage3d,例如 如果我正在开发一个需要多个纹理的应用程序(基本上是唯一的精灵),我是否需要调用context3D.createProgram()并为我希望在应用程序中使用的每个纹理组装一个新的Program3D(带有VertexShaderAssembler和FragmentShaderAssembler) Program3D通常如何在发动机内工作?是一个程序运行整个过程,还是每个纹理、模型和贴图使用一个程序 我是否正确地假设您只需要在初始化期间(事件。添加到阶段)创建一次Program3D,而不是在每个

例如

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

Program3D
通常如何在发动机内工作?是一个程序运行整个过程,还是每个纹理、模型和贴图使用一个程序


我是否正确地假设您只需要在初始化期间(
事件。添加到
阶段)创建一次
Program3D
,而不是在每个帧(
事件。输入
帧),对吗?

您不需要为每个纹理创建新的Program3D。无论何时调用drawTriangles(),渲染器都会使用最后一个程序集。如果您需要以不同的方式处理特定纹理,以便需要不同的片段着色器,那么您确实需要多个Program3D对象,但对于每个对象和纹理,都需要不同的着色器的情况非常罕见

由于没有编写引擎,我无法告诉您这通常是如何完成的。我认为不同类别的模型、环境地图等会有不同的Program3D对象。可能不是每个实体一个。您被限制为大约4000个Program3D对象

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

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

所以程序只制作了一次,但我会在绘制场景之前告诉context3d要使用哪个程序。这样它就可以画出我将要用当前程序画的任何东西

用法示例:

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

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

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


我希望这能对您有所帮助。

Ah k,所以我调用Context3D.setProgram(…)的顺序对于获得所需的Z深度结果可能很重要,对吧?这也意味着,我不需要在我想象的程序之间切换时清除Context3D,特别是如果一个渲染过程只是为了覆盖另一个上一个过程?您需要以正确的顺序绘制东西,以使深度测试正常工作。这也可能决定调用setProgram()的顺序。每次调用present()只需清除一次。