Shader中,模型顶点世界坐标计算问题,求指导

  • Creator 版本:2.3.3

  • 目标平台: 全平台

写了一个shader,将模型顶点的世界坐标x赋值给顶点的红色,当x>1时,直接丢弃。理论上模型应该会出现一个平滑的横截面。当模型放置到(0,0,0)时,显示结果正常,效果为0-1之间为红色,<0 为黑色,大于1丢弃。

当把x 改为x * 0.1时, 0-10之间为红色,大于10丢弃。 这时调整x坐标,模型的横截面不再平滑,相同平面上的模型顶点计算出来的世界坐标不相同。
求帮忙看下是什么问题,相同逻辑,unity显示正常。

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倍,移动模型,横截面出现切口,不再平整。

    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)

请问插值的x是指什么?
v_color.x不能直接修改,我改成下面的方式,还是没有效果
lowp vec4 color = v_color;
color.r = v_worldPos.x * 0.1;
color.g = 0.;
color.b = 0.;

哦,精度没问题,应该是世界坐标问题