Skip to content

Commit

Permalink
Revert "Skinning Shaders: Remove need skinning texture size uniform b…
Browse files Browse the repository at this point in the history
…y using textureSize function (mrdoob#27117)"

This reverts commit 3e0f80f.
  • Loading branch information
arpu committed Feb 2, 2024
1 parent f0c8c4a commit 3917706
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
2 changes: 2 additions & 0 deletions src/objects/Skeleton.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Skeleton {
this.boneMatrices = null;

this.boneTexture = null;
this.boneTextureSize = 0;

this.init();

Expand Down Expand Up @@ -179,6 +180,7 @@ class Skeleton {

this.boneMatrices = boneMatrices;
this.boneTexture = boneTexture;
this.boneTextureSize = size;

return this;

Expand Down
1 change: 1 addition & 0 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1988,6 +1988,7 @@ class WebGLRenderer {
if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();

p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );

} else {

Expand Down
26 changes: 17 additions & 9 deletions src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,27 @@ export default /* glsl */`
uniform mat4 bindMatrixInverse;
uniform highp sampler2D boneTexture;
uniform int boneTextureSize;
mat4 getBoneMatrix( const in float i ) {
int size = textureSize( boneTexture, 0 ).x;
int j = int( i ) * 4;
int x = j % size;
int y = j / size;
vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );
vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );
vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );
vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );
float j = i * 4.0;
float x = mod( j, float( boneTextureSize ) );
float y = floor( j / float( boneTextureSize ) );
return mat4( v1, v2, v3, v4 );
float dx = 1.0 / float( boneTextureSize );
float dy = 1.0 / float( boneTextureSize );
y = dy * ( y + 0.5 );
vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );
vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );
vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );
vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );
mat4 bone = mat4( v1, v2, v3, v4 );
return bone;
}
Expand Down

0 comments on commit 3917706

Please sign in to comment.