Added support for gpu skinning.

This commit is contained in:
2014-05-27 13:46:45 -04:30
parent c2afd241fc
commit 044b3c1d2f
2 changed files with 49 additions and 6 deletions

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#ifdef GL_ES #ifdef GL_ES
precision mediump float; precision mediump float;
#endif #endif

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
// Model-view matrix. // Model-view matrix.
uniform mat4 u_projTrans; uniform mat4 u_projTrans;
@@ -34,12 +35,28 @@ uniform vec3 u_cameraPos;
// Vertex color. // Vertex color.
uniform vec4 u_materialDiffuse; uniform vec4 u_materialDiffuse;
#ifdef SKINNING
// The model's bones.
uniform mat4 u_bone0;
uniform mat4 u_bone1;
uniform mat4 u_bone2;
uniform mat4 u_bone3;
#endif // SKINNING
// Vertex position in world coordinates. // Vertex position in world coordinates.
attribute vec4 a_position; attribute vec4 a_position;
// Vertex normal. // Vertex normal.
attribute vec4 a_normal; attribute vec4 a_normal;
#ifdef SKINNING
// The weight of each bone.
attribute vec2 a_boneWeight0;
attribute vec2 a_boneWeight1;
attribute vec2 a_boneWeight2;
attribute vec2 a_boneWeight3;
#endif // SKINNING
// Fragment normal. // Fragment normal.
varying vec3 v_normal; varying vec3 v_normal;
@@ -56,19 +73,44 @@ varying vec3 v_reflectedVector;
varying float v_nDotL; varying float v_nDotL;
void main(){ void main(){
vec4 transformedPosition = u_geomTrans * a_position; vec4 transformedPosition;
vec3 lightVector = normalize(u_lightPos.xyz);
vec3 invLightVector = normalize(-u_lightPos.xyz); vec3 lightVector = normalize(u_lightPos.xyz);
vec3 invLightVector = -lightVector;
#ifdef SKINNING
// Do the skinning.
mat4 bones[4];
bones[0] = u_bone0;
bones[1] = u_bone1;
bones[2] = u_bone2;
bones[3] = u_bone3;
mat4 skinning = mat4(0.0);
skinning += (a_boneWeight0.y) * bones[int(a_boneWeight0.x)];
skinning += (a_boneWeight1.y) * bones[int(a_boneWeight1.x)];
skinning += (a_boneWeight2.y) * bones[int(a_boneWeight2.x)];
skinning += (a_boneWeight3.y) * bones[int(a_boneWeight3.x)];
// Transform the model.
transformedPosition = u_geomTrans * skinning * a_position;
#else
transformedPosition = u_geomTrans * a_position;
#endif // SKINNING
// Set the varyings. // Set the varyings.
#ifdef SKINNING
v_normal = normalize(vec4(u_normalMatrix * skinning * a_normal).xyz);
#else
v_normal = normalize(vec4(u_normalMatrix * a_normal).xyz); v_normal = normalize(vec4(u_normalMatrix * a_normal).xyz);
#endif // SKINNING
v_eyeVector = normalize(u_cameraPos.xyz - transformedPosition.xyz); v_eyeVector = normalize(u_cameraPos.xyz - transformedPosition.xyz);
v_reflectedVector = normalize(reflect(-lightVector, v_normal)); v_reflectedVector = normalize(reflect(invLightVector, v_normal));
// Diffuse Term. // Diffuse Term.
float invNDotL = max(dot(v_normal.xyz, invLightVector), 0.0); float invNDotL = max(dot(v_normal.xyz, invLightVector), 0.0);
v_nDotL = max(dot(v_normal.xyz, lightVector), 0.0); v_nDotL = max(dot(v_normal.xyz, lightVector), 0.0);
v_diffuse = (u_lightDiffuse * u_materialDiffuse * v_nDotL) + (vec4(0.1, 0.1, 0.2, 1.0) * u_materialDiffuse * invNDotL); v_diffuse = (u_lightDiffuse * u_materialDiffuse * v_nDotL) + (vec4(0.1, 0.1, 0.2, 1.0) * u_materialDiffuse * invNDotL);
gl_Position = u_projTrans * transformedPosition; gl_Position = u_projTrans * transformedPosition;
} }