Win 7 64 bit.
I have two animated models(Naruto and Monstr).
Two model i parse in my program for convert my binary format.
One vertex shader show me normal animation Naruto but bug on model Monstr. I mean bug is some vertexes stretched on model.
#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable
layout (location = 0) in vec3 inPos;
layout (location = 1) in vec2 inColor;
layout (location = 2) in vec3 inNor;
layout (location = 3) in ivec4 inBon;
layout (location = 4) in vec4 inWes;
//for animkeys
layout (binding = 2) buffer somes {
mat4 so[];
} some;
//for vertexbuf anim model
layout (binding = 3) buffer vrtxs {
mat4 Pos[];
} vrtx;
layout (binding = 0) uniform UBO
{
mat4 projectionMatrix;
mat4 viewMatrix;
mat4 modelMatrix;
float Cadr;
float Bones;
} ubo;
layout (push_constant) uniform PushConsts
{
vec4 lightPos[5];
} pushConsts;
layout (location = 0) out vec3 outColor;
layout (location = 1) out vec3 outNor;
void main()
{
outColor = vec3(inColor,0.0) ;
outNor = vec3(inNor) ;
int gg = int(pushConsts.lightPos[0].w);//ubo.Cadr);
int Bone1 = (inBon.x-1);
int Bone2 = (inBon.y-1);
int Bone3 = (inBon.z-1);
int Bone4 = (inBon.w-1);
int BonNum = int(pushConsts.lightPos[1].w);//ubo.Bones);
mat4 nw1 = some.so[BonNum*gg+Bone1];
mat4 nw2 = some.so[BonNum*gg+Bone2];
mat4 nw3 = some.so[BonNum*gg+Bone3];
mat4 nw4 = some.so[BonNum*gg+Bone4];
vec4 nPos2 = vec4(inPos,1.0);
mat4 boneTransform = nw1 * inWes[0];
boneTransform += nw2 * inWes[1];
boneTransform += nw3 * inWes[2];
boneTransform += nw4 * inWes[3];
nPos2 = nPos2 * pushConsts.lightPos[3].w;//scale model
gl_Position = ubo.projectionMatrix * ubo.viewMatrix * boneTransform * vec4(nPos2.xyz + pushConsts.lightPos[3].xyz,1.0 );
}
Another vertex shader show normal Monstr and bug on model Naruto.
#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable
//#extension GL_ARB_draw_instanced : enable
layout (location = 0) in vec3 inPos;
layout (location = 1) in vec2 inColor;
layout (location = 2) in vec3 inNor;
layout (location = 3) in ivec4 inBon;
layout (location = 4) in vec4 inWes;
//for animkeys
layout (binding = 2) buffer somes {
mat4 so[];
} some;
//for vertexbuf anim model
layout (binding = 3) buffer vrtxs {
mat4 Pos[];
} vrtx;
layout (binding = 0) uniform UBO
{
mat4 projectionMatrix;
mat4 viewMatrix;
mat4 modelMatrix;
float Cadr;
float Bones;
} ubo;
// push_constant tolko vulkan fitcha !!! v opengl net
// gl_InstanceIndex tolko vulkan fitcha !!! v opengl net
layout (push_constant) uniform PushConsts
{
vec4 lightPos[5];
} pushConsts;
//in int gl_InstanceID;
layout (location = 0) out vec3 outColor;
layout (location = 1) out vec3 outNor;
void main()
{
outColor = vec3(inColor,0.0) ;
outNor = vec3(inNor) ;
int gg = int(ubo.Cadr);
int Bone1 = (inBon[0]-1);
int Bone2 = (inBon[1]-1);
int Bone3 = (inBon[2]-1);
int Bone4 = (inBon[3]-1);
int BonNum = int(ubo.Bones);
int zi1 = int(BonNum*gg+Bone1);
int zi2 = int(BonNum*gg+Bone2);
int zi3 = int(BonNum*gg+Bone3);
int zi4 = int(BonNum*gg+Bone4);
mat4 nw1 = mat4(some.so[zi1]);
mat4 nw2 = mat4(some.so[zi2]);
mat4 nw3 = mat4(some.so[zi3]);
mat4 nw4 = mat4(some.so[zi4]);
vec4 nPos = vec4(inPos,1.0);
vec4 nPos2 ;
nPos2 = vec4(nw1 * inWes[0] * nPos);
nPos2 += (nw2 * inWes[1] * nPos);
nPos2 += (nw3 * inWes[2] * nPos);
nPos2 += (nw4 * inWes[3] * nPos);
gl_Position = ubo.projectionMatrix * ubo.viewMatrix * vec4(nPos2.xyz + pushConsts.lightPos[3].xyz ,1.0 );
}
I’m shocked !
I checked these models in DX 11 and work all perfect !