Closed cuixiang0130 closed 2 years ago
还有就是PropertyField中的unknownInt0,应该与Uniform的num意思相同,都是表示数组长度,同样名称的PropertyField和Uniform这两个值都相同
精度和插值限定符可能也是按照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
并且感觉Mojang这个结构设计的像是抄了Unity的着色器,这样看来,Pass类中的unknownString0估计是当该Pass不可用时的fallback的Pass的名称,从解析出的文件看也的确有与该名称对应的Pass存在
ShaderInput中的unknownByte0,unknownByte1估计是表示的是哪个attribute,但用的不是它们在枚举中的索引 bgfx的shaderc_hlsl.cpp中有这段
猜测这两个字节应该是这样对应attribute的,试了一下应该没有例外情况
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一模一样,