uniform sampler2D morphDataPos; uniform sampler2D morphDataNor; uniform vec2 morphScaleOffset; uniform vec2 morphDataDim; uniform vec4 morphWeights[8]; void getMorphedVertex(vec2 uvCoord, inout vec3 A){ vec3 totalDelta = vec3(0.0); for(int i = 0; i<8; i++ ) { vec4 tempCoordY = vec4( uvCoord.y - (i * 4) * morphDataDim.y, uvCoord.y - (i * 4 + 1) * morphDataDim.y, uvCoord.y - (i * 4 + 2) * morphDataDim.y, uvCoord.y - (i * 4 + 3) * morphDataDim.y); vec3 morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.x)).rgb * morphScaleOffset.x + morphScaleOffset.y; totalDelta += morphWeights[i].x * morph; morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.y)).rgb * morphScaleOffset.x + morphScaleOffset.y; totalDelta += morphWeights[i].y * morph; morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.z)).rgb * morphScaleOffset.x + morphScaleOffset.y; totalDelta += morphWeights[i].z * morph; morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.w)).rgb * morphScaleOffset.x + morphScaleOffset.y; totalDelta += morphWeights[i].w * morph; } //float deltaLength = length(totalDelta); //if (deltaLength > 5.0) { // clamp corrupted data //totalDelta = normalize(totalDelta) * 5.0; //} A += totalDelta; } void getMorphedNormal(vec2 uvCoord, vec3 oldNor, inout vec3 morphNor){ vec3 normalDelta = vec3(0.0); for(int i = 0; i<8; i++ ) { vec4 tempCoordY = vec4( uvCoord.y - (i * 4) * morphDataDim.y, uvCoord.y - (i * 4 + 1) * morphDataDim.y, uvCoord.y - (i * 4 + 2) * morphDataDim.y, uvCoord.y - (i * 4 + 3) * morphDataDim.y); normalDelta += morphWeights[i].x * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.x)).rgb * 2.0 - 1.0); normalDelta += morphWeights[i].y * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.y)).rgb * 2.0 - 1.0); normalDelta += morphWeights[i].z * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.z)).rgb * 2.0 - 1.0); normalDelta += morphWeights[i].w * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.w)).rgb * 2.0 - 1.0); } morphNor = normalize(oldNor + normalDelta); }