Shader translation code

Started by
-1 comments, last by rgibson11 13 years, 5 months ago
Can someone who understands the 'ARB' shading language please help me.
I had this problem over 6 months now. I am trying to translate the cal3d shader code to glsl and it works fine when model is standing still but when I move the characters hands go to places they should go, making it look like a monster.

I know not many people understand 'ARB' but I thought I may as well try post here.

char vertexProgramStr[]= "!!ARBvp1.0\n""PARAM constant = { 1, 3, 0, 0 };\n""TEMP R0, R1, R2, R3, R4, R5;\n""ADDRESS A0;\n""ATTRIB texCoord = vertex.attrib[8];\n""ATTRIB normal = vertex.attrib[2];\n""ATTRIB index = vertex.attrib[3];\n""ATTRIB weight = vertex.attrib[1];\n""ATTRIB position = vertex.attrib[0];\n""PARAM worldViewProjMatrix[4] = { state.matrix.mvp };\n""PARAM diffuse = state.material.diffuse;\n""PARAM ambient = state.material.ambient;\n""PARAM lightDir = state.light[0].position;\n""PARAM matrix[87] = { program.local[0..86] };\n""\n""MOV result.texcoord[0].xy, texCoord.xyxx;	\n""\n""MUL R4, index, constant.y;	\n""\n""ARL A0.x, R4.y;\n""DP3 R0.x, matrix[A0.x].xyzx, normal.xyzx;\n""DP3 R0.y, matrix[A0.x + 1].xyzx, normal.xyzx;\n""DP3 R0.z, matrix[A0.x + 2].xyzx, normal.xyzx;\n""MUL R1.yzw, R0.xxyz, weight.y;\n""\n""ARL A0.x, R4.x;\n""DP3 R0.x, matrix[A0.x].xyzx, normal.xyzx;\n""DP3 R0.y, matrix[A0.x + 1].xyzx, normal.xyzx;\n""DP3 R0.z, matrix[A0.x + 2].xyzx, normal.xyzx;\n""MAD R1.yzw, R0.xxyz, weight.x, R1.yyzw;\n""\n""DP3 R0.x, R1.yzwy, R1.yzwy;\n""RSQ R0.x, R0.x;\n""MUL R0.xyz, R0.x, R1.yzwy;\n""DP3 R1.x, lightDir.xyzx, lightDir.xyzx;\n""RSQ R1.x, R1.x;\n""MUL R2.xyz, R1.x, lightDir.xyzx;\n""DP3 R0.x, R0.xyzx, R2.xyzx;\n""MAX R0.x, R0.x, constant.z;\n""ADD R0, R0.x, ambient;\n""MUL result.color.front.primary, R0, diffuse;\n""\n""ARL A0.x, R4.w;\n""DPH R0.x, position.xyzx, matrix[A0.x];\n""DPH R0.y, position.xyzx, matrix[A0.x + 1];\n""DPH R0.z, position.xyzx, matrix[A0.x + 2];\n""\n""ARL A0.x, R4.z;\n""DPH R3.x, position.xyzx, matrix[A0.x];\n""DPH R3.y, position.xyzx, matrix[A0.x + 1];\n""DPH R3.z, position.xyzx, matrix[A0.x + 2];\n""\n""ARL A0.x, R4.y;\n""DPH R1.y, position.xyzx, matrix[A0.x];\n""DPH R1.z, position.xyzx, matrix[A0.x + 1];\n""DPH R1.w, position.xyzx, matrix[A0.x + 2];\n""MUL R2.xyz, R1.yzwy, weight.y;\n""\n""ARL A0.x, R4.x;\n""DPH R1.x, position.xyzx, matrix[A0.x];\n""DPH R1.y, position.xyzx, matrix[A0.x + 1];\n""DPH R1.z, position.xyzx, matrix[A0.x + 2];\n""\n""MAD R1.xyz, R1.xyzx, weight.x, R2.xyzx;\n""MAD R1.xyz, R3.xyzx, weight.z, R1.xyzx;\n""MAD R0.xyz, R0.xyzx, weight.w, R1.xyzx;\n""\n""DPH result.position.x, R0.xyzx, worldViewProjMatrix[0];\n""DPH result.position.y, R0.xyzx, worldViewProjMatrix[1];\n""DPH result.position.z, R0.xyzx, worldViewProjMatrix[2];\n""DPH result.position.w, R0.xyzx, worldViewProjMatrix[3];\n""END\n";


uniform mat4 World;uniform mat4 View;uniform mat4 Proj;attribute vec4 weight;attribute vec4 index;const int max_bones = 29;uniform vec4 BoneMatrix[max_bones*3];vec4 getVertex(){     vec4 R0, R1, R2, R3;    int actIndex;    vec3 pos = gl_Vertex.xyz;    //v    actIndex = int(index.w) * 3;    R0.x = dot(pos.xyz, BoneMatrix[actIndex].xyz)  + BoneMatrix[actIndex].w;    //DPH R0.x, position.xyzz, matrix[A0.x];    R0.y = dot(pos.xyz, BoneMatrix[actIndex+1].xyz) + BoneMatrix[actIndex+1].w;    //DPH R0.y, position.xyzz, matrix[A0.x + 1];        R0.z = dot(pos.xyz, BoneMatrix[actIndex+2].xyz) + BoneMatrix[actIndex+2].w;    //DPH R0.z, position.xyzz, matrix[A0.x + 2];        actIndex = int(index.x) * 3;    R1.x = dot(pos.xyz, BoneMatrix[actIndex].xyz)  + BoneMatrix[actIndex].w;    //DPH R1.y, position.xyzx, matrix[A0.x];    R1.y = dot(pos.xyz, BoneMatrix[actIndex+1].xyz) + BoneMatrix[actIndex+1].w;    //DPH R1.z, position.xyzx, matrix[A0.x + 1];    R1.z = dot(pos.xyz, BoneMatrix[actIndex+2].xyz) + BoneMatrix[actIndex+2].w;    //DPH R1.w, position.xyzx, matrix[A0.x + 2];        actIndex = int(index.y) * 3;    R2.x = dot(pos.xyz, BoneMatrix[actIndex].xyz)  + BoneMatrix[actIndex].w;    //DPH R2.x, position.xyzx, matrix[A0.x];    R2.y = dot(pos.xyz, BoneMatrix[actIndex+1].xyz) + BoneMatrix[actIndex+1].w;    //DPH R2.y, position.xyzx, matrix[A0.x + 1];        R2.z = dot(pos.xyz, BoneMatrix[actIndex+2].xyz) + BoneMatrix[actIndex+2].w;    //DPH R2.z, position.xyzx, matrix[A0.x + 2];    actIndex = int(index.z) * 3;    R3.x = dot(pos.xyz, BoneMatrix[actIndex].xyz)  + BoneMatrix[actIndex].w;     //DPH R3.x, position.xyzx, matrix[A0.x];    R3.y = dot(pos.xyz, BoneMatrix[actIndex+1].xyz) + BoneMatrix[actIndex+1].w;    //DPH R3.y, position.xyzx, matrix[A0.x + 1];    R3.z = dot(pos.xyz, BoneMatrix[actIndex+2].xyz) + BoneMatrix[actIndex+2].w;    //DPH R3.z, position.xyzx, matrix[A0.x + 2];    R0 *= weight.w;    R1 *= weight.x;    R2 *= weight.y;    R3 *= weight.z;        R0 = R0 + R1 + R2 + R3;    R0.w =  1.0;        return R0;}vec3 getNormal(void){    vec4 N0, N1, N2;    vec3 normal;    normal = gl_Normal;    int actIndex;     actIndex = int(index.x) * 3;    N1.x = dot(normal.xyzx, BoneMatrix[actIndex].xyzx);    //DPH R1.y, position.xyzx, matrix[A0.x];    N1.y = dot(normal.xyzx, BoneMatrix[actIndex+1].xyzx);    //DPH R1.z, position.xyzx, matrix[A0.x + 1];    N1.z = dot(normal.xyzx, BoneMatrix[actIndex+2].xyzx);    //DPH R1.w, position.xyzx, matrix[A0.x + 2];        actIndex = int(index.y) * 3;    N2.x = dot(normal.xyzx, BoneMatrix[actIndex].xyzx);    //DPH R2.x, position.xyzx, matrix[A0.x];    N2.y = dot(normal.xyzx, BoneMatrix[actIndex+1].xyzx);    //DPH R2.y, position.xyzx, matrix[A0.x + 1];        N2.z = dot(normal.xyzx, BoneMatrix[actIndex+2].xyzx);    //DPH R2.z, position.xyzx, matrix[A0.x + 2];        vec4 N3, N4;    actIndex = int(index.z) * 3;    N3.x = dot(normal.xyzx, BoneMatrix[actIndex].xyzx);    //DPH R1.y, position.xyzx, matrix[A0.x];    N3.y = dot(normal.xyzx, BoneMatrix[actIndex+1].xyzx);    //DPH R1.z, position.xyzx, matrix[A0.x + 1];    N3.z = dot(normal.xyzx, BoneMatrix[actIndex+2].xyzx);    //DPH R1.w, position.xyzx, matrix[A0.x + 2];        actIndex = int(index.w) * 3;    N4.x = dot(normal.xyzx, BoneMatrix[actIndex].xyzx);    //DPH R2.x, position.xyzx, matrix[A0.x];    N4.y = dot(normal.xyzx, BoneMatrix[actIndex+1].xyzx);    //DPH R2.y, position.xyzx, matrix[A0.x + 1];        N4.z = dot(normal.xyzx, BoneMatrix[actIndex+2].xyzx);        N1 *= weight.x;    N2 *= weight.y;    N3 *= weight.z;     N4 *= weight.w;    //?    N0 =  N1 + N2 + N3 + N4;    //N0 sollte die richtige normale sein    return N0.xyz;}void main (void){   mat4 VP = (View * Proj);   mat4 WVP = (World * View * Proj);   mat4 WV = (World * View);   mat4 W = World;   mat4 V = View;   mat4 P = Proj;		  vec4 avertex = getVertex();  gl_Position = avertex * WVP;}

This topic is closed to new replies.

Advertisement