diff --git a/Shaders/std/morph_target.glsl b/Shaders/std/morph_target.glsl index 616acb20..d9096ef6 100644 --- a/Shaders/std/morph_target.glsl +++ b/Shaders/std/morph_target.glsl @@ -1,27 +1,55 @@ uniform sampler2D morphDataPos; uniform sampler2D morphDataNor; uniform vec2 morphScaleOffset; -uniform float morphWeights[32]; +uniform vec2 morphDataDim; +uniform vec4 morphWeights[8]; void getMorphedVertex(vec2 uvCoord, inout vec3 A){ - for(int i = 0; i<32; i++ ) - { - vec2 tempCoord = uvCoord; - tempCoord.y *= i; - vec3 morph = texture(morphDataPos, tempCoord).rgb * morphScaleOffset.x + morphScaleOffset.y; - A += morphWeights[i] * morph; + for(int i = 0; i<8; i++ ) + { + vec4 tempCoordX = vec4( uvCoord.x); + vec4 tempCoordY = vec4( uvCoord.y - (i) * morphDataDim.y, + uvCoord.y - (i + 1) * morphDataDim.y, + uvCoord.y - (i + 2) * morphDataDim.y, + uvCoord.y - (i + 3) * morphDataDim.y); + + vec3 morph = texture(morphDataPos, vec2(tempCoordX.x, tempCoordY.x)).rgb * morphScaleOffset.x + morphScaleOffset.y; + A += morphWeights[i].x * morph; + + morph = texture(morphDataPos, vec2(tempCoordX.y, tempCoordY.y)).rgb * morphScaleOffset.x + morphScaleOffset.y; + A += morphWeights[i].y * morph; + + morph = texture(morphDataPos, vec2(tempCoordX.z, tempCoordY.z)).rgb * morphScaleOffset.x + morphScaleOffset.y; + A += morphWeights[i].z * morph; + + morph = texture(morphDataPos, vec2(tempCoordX.w, tempCoordY.w)).rgb * morphScaleOffset.x + morphScaleOffset.y; + A += morphWeights[i].w * morph; } } void getMorphedNormal(vec2 uvCoord, vec3 oldNor, inout vec3 morphNor){ - for(int i = 0; i<32; i++ ) + + for(int i = 0; i<8; i++ ) { - vec2 tempCoord = uvCoord; - tempCoord.y *= i; - vec3 norm = morphWeights[i] + (texture(morphDataNor, tempCoord).rgb * 2.0 - 1.0); + vec4 tempCoordX = vec4( uvCoord.x); + vec4 tempCoordY = vec4( uvCoord.y - (i) * morphDataDim.y, + uvCoord.y - (i + 1) * morphDataDim.y, + uvCoord.y - (i + 2) * morphDataDim.y, + uvCoord.y - (i + 3) * morphDataDim.y); + + vec3 norm = oldNor + morphWeights[i].x * (texture(morphDataNor, vec2(tempCoordX.x, tempCoordY.x)).rgb * 2.0 - 1.0); morphNor += norm; + + norm = oldNor + morphWeights[i].y * (texture(morphDataNor, vec2(tempCoordX.y, tempCoordY.y)).rgb * 2.0 - 1.0); + morphNor += norm; + + norm = oldNor + morphWeights[i].z * (texture(morphDataNor, vec2(tempCoordX.z, tempCoordY.z)).rgb * 2.0 - 1.0); + morphNor += norm; + + norm = oldNor + morphWeights[i].w * (texture(morphDataNor, vec2(tempCoordX.w, tempCoordY.w)).rgb * 2.0 - 1.0); + morphNor += norm; + } - morphNor += oldNor; morphNor = normalize(morphNor); } \ No newline at end of file