文档管理中心
我的
指南图形计算服务CG渲染框架其他特性动态材质

动态材质

CG Kit提供的动态材质功能支持在shader里除已有的uniform GlobalUniform和uniform ModelUniform,可自定义uniform buffer,并能够在渲染过程中动态更新自定义uniform buffer的值,实现材质的颜色和效果动态变化。

使用约束

自定义uniform buffer的使用约束如下。
  • set取值范围为[0, 3],类型为int。
  • 当set = 0时,binding取值范围为[10, 63],当set = 1或2或3时,binding取值范围为[0, 63]。
  • 同一个cgmat对应的材质下,要求uniform buffer的名字必须全局唯一。
  • 根据vulkan 1.0和vulkan 1.1的规格要求,同一个cgmat对应的材质下,要求所有shader的uniform buffer总数不超过8个。

使用动态材质

  1. 在shader里配置自定义uniform buffer。
    layout(set=0, binding=10) uniform ColorInfo
    {
        vec2 diffvec2;
        vec3 diffvec3;
        vec2 diffvec4;
        vec2 diffvec5;
        vec4 color;
    }
    colorInfo;
    说明

    CG Kit仅支持shader中uniform结构的变量类型:int、float、vec2、vec3、vec4、mat4。

  1. 在cgmat文件的resource节点下增加constants节点,与自定义uniform buffer做映射。
    渲染框架支持顶点shader或像素shader里配置uniform buffer,用户需要在cgmat文件中配置自定义uniform buffer信息和初始值。
    "resource": {
            "texture": [
                {
                    "uri": "cubemaps/02/cubemap_02_nomip.ktx",
                    "name": "envTexture",
                    "samplerIndex": 0
                }
            ],
            "sampler": [{ }],
            "constants": [
                {
                    "name": "ColorInfo",
                    "type": "UNIFORM",
                    "value": [
                        {
                            "name": "diffvec2",
                            "type": "vec2",
                            "value": [
                                1,
                                0
                            ]
                        },
                        {
                            "name": "diffvec3",
                            "type": "vec3",
                            "value": [
                                1,
                                0,
                                1
                            ]
                        },
                        {
                            "name": "diffvec4",
                            "type": "vec2",
                            "value": [
                                1,
                                0
                            ]
                        },
                        {
                            "name": "diffvec5",
                            "type": "vec2",
                            "value": [
                                1,
                                0
                            ]
                        },
                        {
                            "name": "color",
                            "type": "color",
                            "value": [
                                255,
                                0,
                                0,
                                255
                            ]
                        }
                    ]
                }
            ],
            "shader": [
                {
                    "uri": "shaders/color.frag",
                    "type": "SHADER_STAGE_TYPE_FRAGMENT"
                },
                {
                    "uri": "shaders/static.vert",
                    "type": "SHADER_STAGE_TYPE_VERTEX"
                }
            ]
        }
    说明

    CG Kit仅支持cgmat配置文件中uniform结构的变量类型:uint、float、vec2、vec3、vec4、mat4、color(即Color类,对应shader里的vec4)。

  2. 通过SetConstantValue修改自定义uniform buffer中变量的值,实现材质的动态变化效果。
    MeshRenderer* meshRenderer = m_cubeObject->GetComponent<MeshRenderer>();
    for (auto materialInstance : meshRenderer->GetMaterialInstances()) {
        const String unionName = "ColorInfo";
        const String varName = "color";
        uint32_t index = materialInstance->GetConstantValueIndex(unionName, varName);
        switch (m_colorFlag) {
            case 0: {
                // Red
                materialInstance->SetConstantValue(index, Color::RED);
                break;
            }
            case 1: {
                // Green
                materialInstance->SetConstantValue(index, Color::GREEN);
                break;
            }
            case 2: {
                // Blue
                materialInstance->SetConstantValue(index, Color::BLUE);
                break;
            }
            default:
                break;
        }