Kode / Kha

Ultra-portable, high performance, open source multimedia framework.
http://kha.tech
zlib License
1.49k stars 174 forks source link

Uniform arrays not passed to shader with D3D target #843

Open posxposy opened 6 years ago

posxposy commented 6 years ago

Hi, Not sure why, but uniforms was not passed to shader in D3D in that way

struct LightStruct {
    vec3 position;
    vec3 color;
    float power;
    float radius;
};
const int MAX_LIGHTS = 64;
uniform LightStruct lights[MAX_LIGHTS];

void main() {
    for(int i = 0; i < MAX_LIGHTS; ++i) {
        LightStruct light = lights[i];

        light.color = always black
        light.power = always 0
        ....and so on
    }
}

In Haxe code:

Initialization:

        lightStructs = new Array<LightStruct>();
        for (i in 0...MAX_LIGHTS) {
            var struct:LightStruct = new LightStruct (
                pipeline.getConstantLocation("lights[" + i + "].position"),
                pipeline.getConstantLocation("lights[" + i + "].color"),
                pipeline.getConstantLocation("lights[" + i + "].power"),
                pipeline.getConstantLocation("lights[" + i + "].radius")
            );

            lightStructs.push(struct);
        }

Rendering:

        for (i in 0...lights.length) {
            if (i <= MAX_LIGHTS) {
                var light:Light = lights[i];
                var struct:LightStruct = lightStructs[i];
                renderTarget.g4.setFloat3(struct.positionID, light.x, light.y, light.z);
                renderTarget.g4.setFloat3(struct.colorID, light.color.R, light.color.G, light.color.B);
                renderTarget.g4.setFloat(struct.powerID, light.power);
                renderTarget.g4.setFloat(struct.radiusID, light.radius);
            }
        }
BlackGoku36 commented 3 years ago

Same issue on metal