Shader: 蒙皮模型顶点坐标转世界坐标计算错误?

  • Creator 版本:2.3.3

  • 目标平台: 全平台

在shader中使用世界坐标,当模型坐标不在(0,0,0)时,世界坐标怀疑计算错误。

CCProgram vs %{
    precision highp float;
    #include <cc-local>
    #include <cc-global>
    #include <skinning>
    #include <input-standard>

    #define CC_USE_TEXTURE CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE && USE_LIGHT_TEX

    uniform MAIN_TILING {
        vec2 mainTiling;
        vec2 mainOffset;
    };

    #if CC_USE_TEXTURE
    out mediump vec2 v_uv0;
    #endif

    #if CC_USE_ATTRIBUTE_COLOR
    out lowp vec4 v_color;
    #endif

    out vec3 v_worldPos;

    void main () {
        StandardVertInput In;
        CCVertInput(In);
        #if CC_USE_ATTRIBUTE_COLOR
            v_color = In.color;
        #endif

        #if CC_USE_TEXTURE
            v_uv0 = In.uv * mainTiling + mainOffset;
        #endif


        vec4 position = In.position;
       //计算世界坐标
        v_worldPos = (cc_matWorld * position).xyz;
        gl_Position = cc_matViewProj * cc_matWorld * In.position;
    }

}%

CCProgram fs %{
    precision highp float;

    #include <alpha-test>
    #include <cc-global>
    #include <texture>
    #include <output>

    uniform UNLIT {
        lowp vec4 diffuseColor;
    };

    in vec3 v_worldPos;
    #if USE_DIFFUSE_TEXTURE
    uniform sampler2D diffuseTexture;
    #endif

    #define CC_USE_TEXTURE CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE

    #if CC_USE_ATTRIBUTE_COLOR
    in lowp vec4 v_color; 
    #endif

    #if CC_USE_TEXTURE
    in mediump vec2 v_uv0;
    #endif

    void main () {
                vec4 color = diffuseColor;
                //使用红色展示顶点世界坐标
		color.r = v_worldPos.x ;
		color.g = 0.;
		color.b = 0.;
                //x坐标大于1的点丢弃,理论上应该显示切面
		if(color.r >= 1.)
        {
            discard;
        }

        ALPHA_TEST(color);

        gl_FragColor = CCFragOutput(color);
    }
}%

把模型放到(0,0,0)坐标点,模型显示符合预期,出现一个整齐的横截面。

调整fs,将x坐标缩小10倍,调整模型到(10,0,0)

    void main () {
		vec4 color = diffuseColor;
		color.r = v_worldPos.x * 0.1;
		color.g = 0.;
		color.b = 0.;
		if(color.r >= 1.)
        {
            discard;
        }
        ALPHA_TEST(color);

        gl_FragColor = CCFragOutput(color);
    }

横截面出现凹凸痕迹,部分区域相同x的点的颜色值不同。

相同的逻辑,在unity中就显示正常。

麻烦帮忙看下是哪里出了问题,是模型有问题还是计算顶点坐标有问题。NewProject_2.rar (269.9 KB)

@jare