ジオメトリーシェーダーを試す - saitocastel1900/UnityShader GitHub Wiki
- ジオエントリシェーダーとは、頂点単位ではなくポリゴン単位で処理できる機能のことらしい
- vertex→geometry→fragmentの順番で処理が行われる
- maxvertexcountは同時に扱う頂点の数らしい
- inout ○○Streamで扱ったデータを次の処理に参照渡ししているみたい。returnの役割
- input「0」とかで、隣り合う頂点を取得できるみたい。
- 外積で、法線ベクトルを求めている
- ちなみに、外積は、二つのベクトルの垂直方向を、内積は二つのベクトルがどの程度同じ向きなのかを知ることができる
- ちなみに、外積は、二つのベクトルの垂直方向を、内積は二つのベクトルがどの程度同じ向きなのかを知ることができる
Shader "Unlit/GeometryNormalMoveUnlitShader"
{
Properties
{
_Color("Color",Color) = (1,1,1,1)
_PositionFactor("PositionFactor",Float) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
float _PositionFactor;
struct appdata
{
float4 vertex : POSITION;
};
//ジオメトリーシェーダーからフラグメントシェーダーに渡す値
struct g2f
{
float4 vertet : SV_POSITION;
};
appdata vert (appdata v)
{
return v;
}
[maxvertexcount(3)]
void geom(triangle appdata input[3],inout TriangleStream<g2f> stream)
{
float3 vec1 = input[1].vertex - input[0].vertex;
float3 vec2 = input[2].vertex - input[0].vertex;
float3 normal = normalize(cross(vec1,vec2));
[unroll]
for (int i = 0; i < 3; ++i)
{
appdata v = input[i];
g2f o;
v.vertex.xyz += normal * sin((_Time.w)*0.5) * _PositionFactor;
o.vertet = UnityObjectToClipPos(v.vertex);
stream.Append(o);
}
}
fixed4 frag (g2f i) : SV_Target
{
return _Color;
}
ENDCG
}
}
}