从一个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;
}
