ddf8196 / MaterialBinTool

MCBE RenderDragon着色器解包/打包/编译工具
MIT License
108 stars 12 forks source link

ShaderInput估计是根据varying.def.sc生成的 #2

Closed cuixiang0130 closed 2 years ago

cuixiang0130 commented 2 years ago

ShaderInput中的unknownByte0,unknownByte1估计是表示的是哪个attribute,但用的不是它们在枚举中的索引 bgfx的shaderc_hlsl.cpp中有这段

static const RemapInputSemantic s_remapInputSemantic[bgfx::Attrib::Count + 1] =
    {
        { bgfx::Attrib::Position,  "POSITION",     0 },
        { bgfx::Attrib::Normal,    "NORMAL",       0 },
        { bgfx::Attrib::Tangent,   "TANGENT",      0 },
        { bgfx::Attrib::Bitangent, "BITANGENT",    0 },
        { bgfx::Attrib::Color0,    "COLOR",        0 },
        { bgfx::Attrib::Color1,    "COLOR",        1 },
        { bgfx::Attrib::Color2,    "COLOR",        2 },
        { bgfx::Attrib::Color3,    "COLOR",        3 },
        { bgfx::Attrib::Indices,   "BLENDINDICES", 0 },
        { bgfx::Attrib::Weight,    "BLENDWEIGHT",  0 },
        { bgfx::Attrib::TexCoord0, "TEXCOORD",     0 },
        { bgfx::Attrib::TexCoord1, "TEXCOORD",     1 },
        { bgfx::Attrib::TexCoord2, "TEXCOORD",     2 },
        { bgfx::Attrib::TexCoord3, "TEXCOORD",     3 },
        { bgfx::Attrib::TexCoord4, "TEXCOORD",     4 },
        { bgfx::Attrib::TexCoord5, "TEXCOORD",     5 },
        { bgfx::Attrib::TexCoord6, "TEXCOORD",     6 },
        { bgfx::Attrib::TexCoord7, "TEXCOORD",     7 },
        { bgfx::Attrib::Count,     "",             0 },
    };

猜测这两个字节应该是这样对应attribute的,试了一下应该没有例外情况

enum class Attribute(val index: Byte, val subIndex: Byte) {
    Position(0, 0),
    Normal(1, 0),
    Tangent(2, 0),
    Bitangent(3, 0),
    Color0(4, 0),
    Color1(4, 1),
    Color2(4, 2),
    Color3(4, 3),
    Indices(5, 0),
    Weights(6, 0),
    TexCoord0(7, 0),
    TexCoord1(7, 1),
    TexCoord2(7, 2),
    TexCoord3(7, 3),
    TexCoord4(7, 4),
    TexCoord5(7, 5),
    TexCoord6(7, 6),
    TexCoord7(7, 7),
//bgfx中没有8,但是反汇编.so和解包的时候都有8
    TexCoord8(7, 8),
}

unknownBool1大概是表明是否是InstanceData,bgfx启用Instancing时,传i_data0之类的attribute与一般的attribute不一样,有一个专门的InstanceDataBuffer什么的,并且确实只有InstanceData这个值是true 这些都是写在varying.def.sc中的,还有后面的precision和interpolation限定符也写在这里面。 但这里面貌似不能写宏定义什么的,所以所有的variant的ShaderInput都一模一样,即便某些input在部分variant代码中根本没有出现。并且hash值也是通过这个文件计算的,这就使得虽然各个variant的varying变量并不完全相同,但所有variant着色器的hash一模一样,

cuixiang0130 commented 2 years ago

还有就是PropertyField中的unknownInt0,应该与Uniform的num意思相同,都是表示数组长度,同样名称的PropertyField和Uniform这两个值都相同

cuixiang0130 commented 2 years ago

精度和插值限定符可能也是按照bgfx中这样的顺序排列

                            if (0 == bx::strCmp(typen, "lowp", 4)
                ||  0 == bx::strCmp(typen, "mediump", 7)
                ||  0 == bx::strCmp(typen, "highp", 5) )
                {
                    precision = typen;
                    typen = parse = bx::strws(bx::strSkipWord(parse) );
                }

                if (0 == bx::strCmp(typen, "flat", 4)
                ||  0 == bx::strCmp(typen, "smooth", 6)
                ||  0 == bx::strCmp(typen, "noperspective", 13)
                ||  0 == bx::strCmp(typen, "centroid", 8) )
                {
                    interpolation = typen;
                    typen = parse = bx::strws(bx::strSkipWord(parse) );
                    usesInterpolationQualifiers = true;
                }

不过PrecisionConstraint没有出现 InterpolationConstraint似乎只出现了3 这个着色器代码应该是在原来的基础上改的 例如原来renderchunk中用的是centroid,对于现在texcoord0的插值限定符应该也是centroid,其它的不好说,但3应该就是Centroid

#if __VERSION__ >= 300
    #ifndef BYPASS_PIXEL_SHADER
        _centroid out vec2 uv0;
        _centroid out vec2 uv1;
    #endif
#else
    #ifndef BYPASS_PIXEL_SHADER
        varying vec2 uv0;
        varying vec2 uv1;
    #endif
#endif
cuixiang0130 commented 2 years ago

并且感觉Mojang这个结构设计的像是抄了Unity的着色器,这样看来,Pass类中的unknownString0估计是当该Pass不可用时的fallback的Pass的名称,从解析出的文件看也的确有与该名称对应的Pass存在

ddf8196 commented 2 years ago

b566b4b