| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // ----------------------------------------------------------------
- // From Game Programming in C++ by Sanjay Madhav
- // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
- //
- // Released under the BSD License
- // See LICENSE in root directory for full details.
- // ----------------------------------------------------------------
- // Request GLSL 3.3
- #version 330
- // Uniforms for world transform and view-proj
- uniform mat4 uWorldTransform;
- uniform mat4 uViewProj;
- // Uniform for matrix palette
- uniform mat4 uMatrixPalette[96];
- // Attribute 0 is position, 1 is normal,
- // 2 is bone indices, 3 is weights,
- // 4 is tex coords.
- layout(location = 0) in vec3 inPosition;
- layout(location = 1) in vec3 inNormal;
- layout(location = 2) in uvec4 inSkinBones;
- layout(location = 3) in vec4 inSkinWeights;
- layout(location = 4) in vec2 inTexCoord;
- // Any vertex outputs (other than position)
- out vec2 fragTexCoord;
- // Normal (in world space)
- out vec3 fragNormal;
- // Position (in world space)
- out vec3 fragWorldPos;
- void main()
- {
- // Convert position to homogeneous coordinates
- vec4 pos = vec4(inPosition, 1.0);
-
- // Skin the position
- vec4 skinnedPos = (pos * uMatrixPalette[inSkinBones.x]) * inSkinWeights.x;
- skinnedPos += (pos * uMatrixPalette[inSkinBones.y]) * inSkinWeights.y;
- skinnedPos += (pos * uMatrixPalette[inSkinBones.z]) * inSkinWeights.z;
- skinnedPos += (pos * uMatrixPalette[inSkinBones.w]) * inSkinWeights.w;
- // Transform position to world space
- skinnedPos = skinnedPos * uWorldTransform;
- // Save world position
- fragWorldPos = skinnedPos.xyz;
- // Transform to clip space
- gl_Position = skinnedPos * uViewProj;
- // Skin the vertex normal
- vec4 skinnedNormal = vec4(inNormal, 0.0f);
- skinnedNormal = (skinnedNormal * uMatrixPalette[inSkinBones.x]) * inSkinWeights.x
- + (skinnedNormal * uMatrixPalette[inSkinBones.y]) * inSkinWeights.y
- + (skinnedNormal * uMatrixPalette[inSkinBones.z]) * inSkinWeights.z
- + (skinnedNormal * uMatrixPalette[inSkinBones.w]) * inSkinWeights.w;
- // Transform normal into world space (w = 0)
- fragNormal = (skinnedNormal * uWorldTransform).xyz;
- // Pass along the texture coordinate to frag shader
- fragTexCoord = inTexCoord;
- }
|