Skip to content

Commit

Permalink
fix: Fix screenCoordinates outline rendering in WebGL
Browse files Browse the repository at this point in the history
0b5vr committed Sep 13, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
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
@@ -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

0 comments on commit cd6c501

Please sign in to comment.