UnityのFragment Shaderで
図形を合成する方法を説明します。
以下が基本Shaderとし、このシェーダを改変していきます。
Shader "Unlit/Compose_Base" { Properties { } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" void Ellipse(float2 UV, float Width, float Height, out float Out) { float d = length((UV * 2 - 1) / float2(Width, Height)); Out = saturate((1 - d) / fwidth(d)); } struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { float col1; float col2; Ellipse(i.uv * 2 - 0.5 + float2(-0.3, 0), 1, 1, col1); Ellipse(i.uv * 2 - 0.5 + float2( 0.3, 0), 1, 1, col2); return col1; // ここに改変コードを追加 } ENDCG } } }

反転
return 1 - col1;

結合
return saturate(col1 + col2);

差分
return saturate(col1 - col2);

交差
return 1 - saturate((1 - col1) + (1 - col2));

排他
float intersect = 1 - saturate((1 - col1) + (1 - col2)); float _union = saturate(col1 + col2); return saturate(_union - intersect);

バージョン
- Unity : 2022.3.22f1