mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-24 11:35:24 -05:00
Screen 座標系の線幅のマイグレーションミスを修正
This commit is contained in:
@@ -298,7 +298,9 @@ namespace UniVRM10
|
||||
break;
|
||||
case OutlineWidthMode.ScreenCoordinates:
|
||||
dst.OutlineWidthMode = UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMode.screenCoordinates;
|
||||
dst.OutlineWidthFactor = mtoon.Definition.Outline.OutlineWidthValue * oneHundredth;
|
||||
// NOTE: 従来は、縦幅の半分を 100% としたときの % の値だった。
|
||||
// 1.0 では縦幅を 1 としたときの値とするので、 1/200 する。
|
||||
dst.OutlineWidthFactor = mtoon.Definition.Outline.OutlineWidthValue * oneHundredth * 0.5f;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException($"OutlineWidthMode: {(int)mtoon.Definition.Outline.OutlineWidthMode}");
|
||||
|
||||
@@ -49,12 +49,14 @@ inline VertexPositionInfo MToon_GetOutlineVertex(const float3 positionOS, const
|
||||
const half3 normalVS = MToon_GetObjectToViewNormal(normalOS);
|
||||
const half3 normalCS = TransformViewToProjection(normalVS.xyz);
|
||||
|
||||
const float clipSpaceHeight = 2.0f;
|
||||
const float widthScaledMaxMeter = 1.0f;
|
||||
|
||||
half2 normalProjectedCS = normalize(normalCS.xy);
|
||||
// NOTE: VR などの高視野角カメラでは、純粋な実装では太くなりすぎる.
|
||||
// よって 1m 以上離れたら、それ以上太くならないようにする.
|
||||
const half outlineWidthMultiplier = outlineWidth * min(positionCS.w, widthScaledMaxMeter);
|
||||
normalProjectedCS *= outlineWidthMultiplier;
|
||||
normalProjectedCS *= clipSpaceHeight * outlineWidthMultiplier;
|
||||
normalProjectedCS.x *= aspect;
|
||||
// NOTE: カメラ方向軸を向く法線を持つ頂点が XY 方向にだけずれると困るので、それを抑制する.
|
||||
normalProjectedCS.xy *= saturate(1 - normalVS.z * normalVS.z);
|
||||
|
||||
Reference in New Issue
Block a user