Cocos2dx 3.7 3.8 3D模型运用自定义shader后蒙皮骨骼动画出问题

从一个c3b文件读入创建一个Sprite3D, 然后用setGLProgramState执行自定义的shader后模型就出现非常奇怪的问题。shader直接复制默认的cc3D_SkinPositionTex_vert 和cc3D_ColorTex_frag也会出现问题,估计是blendWeight和blendIndex出现错误如图,左边是自定义shader,右边是没有,用引擎提供的默认shader,该问题只会出现在运用了蒙皮骨骼动画的模型上。
求解答,或者有什么其他思路,我查过流程上应该没错。

C++

auto fish = Sprite3D::create("Resources/F_hdy.c3b");
this->addChild(fish);
 
auto glprogram = GLProgram::createWithFilenames("Resources/shaders/fish_wave.vsh", "Resources/shaders/fish_wave.fsh");
auto glprogramstate = GLProgramState::create(glprogram);
sprite->setGLProgramState(glprogramstate);
 
long offset = 0;
auto attributeCount = sprite->getMesh()->getMeshVertexAttribCount();
for (auto k = 0; k < attributeCount; k++) {
 auto meshattribute = sprite->getMesh()->getMeshVertexAttribute(k);
 glprogramstate->setVertexAttribPointer(s_attributeNames,
 meshattribute.size,
 meshattribute.type,
 GL_FALSE,
 sprite->getMesh()->getVertexSizeInBytes(),
           (GLvoid*)offset);
 offset += meshattribute.attribSizeBytes;
}

VS代码

attribute vec3 a_position;
 
attribute vec4 a_blendWeight;
attribute vec4 a_blendIndex;
 
attribute vec2 a_texCoord;
 
const int SKINNING_JOINT_COUNT = 60;
// Uniforms
uniform vec4u_matrixPalette;
 
// Varyings
varying vec2 TextureCoordOut;
 
vec4 getPosition()
{
   float blendWeight = a_blendWeight;
 
   int matrixIndex = int (a_blendIndex) * 3;
   vec4 matrixPalette1 = u_matrixPalette * blendWeight;
   vec4 matrixPalette2 = u_matrixPalette * blendWeight;
   vec4 matrixPalette3 = u_matrixPalette * blendWeight;
    
   blendWeight = a_blendWeight;
   if (blendWeight > 0.0)
    {
       matrixIndex = int(a_blendIndex) * 3;
       matrixPalette1 += u_matrixPalette * blendWeight;
       matrixPalette2 += u_matrixPalette * blendWeight;
       matrixPalette3 += u_matrixPalette * blendWeight;
       
       blendWeight = a_blendWeight;
       if (blendWeight > 0.0)
       {
           matrixIndex = int(a_blendIndex) * 3;
           matrixPalette1 += u_matrixPalette * blendWeight;
           matrixPalette2 += u_matrixPalette * blendWeight;
           matrixPalette3 += u_matrixPalette * blendWeight;
           
           blendWeight = a_blendWeight;
            if (blendWeight > 0.0)
           {
                matrixIndex =int(a_blendIndex) * 3;
                matrixPalette1 +=u_matrixPalette * blendWeight;
                matrixPalette2 +=u_matrixPalette * blendWeight;
                matrixPalette3 +=u_matrixPalette * blendWeight;
           }
       }
    }
 
   vec4 _skinnedPosition;
   vec4 postion = vec4(a_position, 1.0);
   _skinnedPosition.x = dot(postion, matrixPalette1);
   _skinnedPosition.y = dot(postion, matrixPalette2);
   _skinnedPosition.z = dot(postion, matrixPalette3);
   _skinnedPosition.w = postion.w;
    
   return _skinnedPosition;
}
 
void main()
{
   vec4 position = getPosition();
   gl_Position =CC_MVPMatrix * position;
    
   TextureCoordOut = a_texCoord;
   TextureCoordOut.y = 1.0 - TextureCoordOut.y;
}

FS代码

precision mediump int;
precision mediump float;
 
uniform sampler2D u_lightTexture;
uniform vec4 u_color;
 
varying vec2 TextureCoordOut;
varying vec3 v_animLight;
 
// Global variables
vec3 _ambientColor;
 
 
void main(void) 
{
   vec4 baseColor = texture2D(CC_Texture0, TextureCoordOut);
   _ambientColor = baseColor.rgb * u_color.rgb;
                                     
   gl_FragColor.a = baseColor.a;    
   gl_FragColor.rgb = _ambientColor;
}

最新的发现,只有当这个Sprite3D拥有多个Meshes时候才会有这个错误

支持楼主,建议楼主去git上提个bug:https://github.com/cocos2d/cocos2d-x