You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenFL中向着色器传递参数:数组传递问题咨询

在OpenFL中向着色器传递浮点/向量数组的解决方案

嘿,我之前也遇到过一模一样的问题!直接用Array<Float>作为ShaderParameter的类型虽然能编译,但OpenFL没法自动识别数组长度,导致数据根本没传到着色器里。下面给你讲具体的解决办法:

核心问题

OpenFL的ShaderParameter处理数组时,必须显式指定数组的总元素数量(也就是size属性),不然着色器不知道该接收多少数据,自然读不到值。

具体步骤

1. Haxe代码中正确配置ShaderParameter

不管是浮点数组还是向量数组,都用ShaderParameter<Array<Float>>来声明,然后设置value和size:

示例1:传递浮点数组(比如4个float)

var floatArrayParam: ShaderParameter<Array<Float>> = new ShaderParameter<Array<Float>>();
floatArrayParam.value = [1.0, 2.0, 3.0, 4.0]; // 4个浮点数的数组
floatArrayParam.size = 4; // 必须和value的长度一致
this.data.myFloatArray = floatArrayParam;

示例2:传递向量数组(比如2个vec2)

向量数组需要把每个向量的分量按顺序塞进Float数组,然后size设为总分量数:

var vec2ArrayParam: ShaderParameter<Array<Float>> = new ShaderParameter<Array<Float>>();
// 两个vec2:(0.5, 0.5) 和 (1.0, 0.0),按分量展开
vec2ArrayParam.value = [0.5, 0.5, 1.0, 0.0];
vec2ArrayParam.size = 4; // 2个vec2 × 2分量 = 4个总元素
this.data.myVec2Array = vec2ArrayParam;

2. 着色器中对应声明uniform

要保证uniform的名字和Haxe里data的属性名完全一致,数组长度也要匹配:

对应浮点数组的GLSL代码

uniform float myFloatArray[4]; // 数组长度和Haxe里的元素数量对应

对应vec2数组的GLSL代码

uniform vec2 myVec2Array[2]; // 数组长度是向量的个数,不是总分量数

3. 注意事项

  • 大小写敏感:Haxe里的myVec2Array和着色器里的myVec2Array必须完全一致,包括大小写。
  • 向量数组的分量顺序:比如vec3数组,要按[x1,y1,z1, x2,y2,z2, x3,y3,z3]的顺序传递,size设为9(3个vec3 ×3分量)。
  • 如果数组长度动态变化,要记得同步更新size属性,不然着色器会读取错误的数据。

完整示例代码

这里给你一个可运行的完整示例,传递vec2数组到着色器并使用:

class OffsetShader extends Shader {
    public function new() {
        super();
        
        // 配置vec2数组参数
        var offsetParams: ShaderParameter<Array<Float>> = new ShaderParameter<Array<Float>>();
        offsetParams.value = [0.2, 0.2, -0.2, -0.2]; // 两个偏移向量
        offsetParams.size = 4;
        this.data.offsets = offsetParams;
    }

    override public function createFragmentShader(): String {
        return 
            "uniform vec2 offsets[2];\n" +
            "void main() {\n" +
            "    // 使用第一个偏移向量修改纹理坐标\n" +
            "    vec2 uv = gl_TexCoord[0].xy + offsets[0];\n" +
            "    gl_FragColor = texture2D(gl_Texture[0], uv);\n" +
            "}";
    }
}

这样设置后,着色器就能正确读取到数组里的值了!

内容的提问来源于stack exchange,提问作者Matías González

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:52:07