Skip to content

Commit

Permalink
fix: Fix screenCoordinates outline rendering in WebGL
Browse files Browse the repository at this point in the history
  • Loading branch information
0b5vr committed Sep 13, 2024
1 parent ea1e946 commit cd6c501
Showing 1 changed file with 8 additions and 13 deletions.
21 changes: 8 additions & 13 deletions packages/three-vrm-materials-mtoon/src/shaders/mtoon.vert
Original file line number Diff line number Diff line change
Expand Up @@ -92,27 +92,22 @@ void main() {

vViewPosition = - mvPosition.xyz;

float outlineTex = 1.0;

#ifdef OUTLINE
float worldNormalLength = length( transformedNormal );
vec3 outlineOffset = outlineWidthFactor * worldNormalLength * objectNormal;

#ifdef USE_OUTLINEWIDTHMULTIPLYTEXTURE
vec2 outlineWidthMultiplyTextureUv = ( outlineWidthMultiplyTextureUvTransform * vec3( vUv, 1 ) ).xy;
outlineTex = texture2D( outlineWidthMultiplyTexture, outlineWidthMultiplyTextureUv ).g;
#endif

#ifdef OUTLINE_WIDTH_WORLD
float worldNormalLength = length( transformedNormal );
vec3 outlineOffset = outlineWidthFactor * outlineTex * worldNormalLength * objectNormal;
gl_Position = projectionMatrix * modelViewMatrix * vec4( outlineOffset + transformed, 1.0 );
float outlineTex = texture2D( outlineWidthMultiplyTexture, outlineWidthMultiplyTextureUv ).g;
outlineOffset *= outlineTex;
#endif

#ifdef OUTLINE_WIDTH_SCREEN
vec3 clipNormal = ( projectionMatrix * modelViewMatrix * vec4( objectNormal, 0.0 ) ).xyz;
vec2 projectedNormal = normalize( clipNormal.xy );
projectedNormal.x *= projectionMatrix[ 0 ].x / projectionMatrix[ 1 ].y;
gl_Position.xy += 2.0 * outlineWidthFactor * outlineTex * projectedNormal.xy;
outlineOffset *= vViewPosition.z / projectionMatrix[ 1 ].y;
#endif

gl_Position = projectionMatrix * modelViewMatrix * vec4( outlineOffset + transformed, 1.0 );

gl_Position.z += 1E-6 * gl_Position.w; // anti-artifact magic
#endif

Expand Down

0 comments on commit cd6c501

Please sign in to comment.