Skip to content

Instantly share code, notes, and snippets.

@TheStoneBook
Last active September 18, 2018 18:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TheStoneBook/8dfef6c5e5313e24da5c23eb8378a0f5 to your computer and use it in GitHub Desktop.
Save TheStoneBook/8dfef6c5e5313e24da5c23eb8378a0f5 to your computer and use it in GitHub Desktop.
【Unity】ポリゴンをボクセルに【Shader】
Shader "Geometry/PolygonToBoxel"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MainColor("Color",Color)=(1,1,1,1)
_BoxScale("BoxScale",Range(0.0, 0.1)) = 0.01
}
SubShader
{
Tags { "RenderType"="Transparent" }
LOD 100
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
struct g2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
sampler2D _MainTex;
fixed4 _MainColor;
fixed _BoxScale;
appdata vert (appdata v)
{
return v;
}
#define ADD_VERT(v, n) \
o.vertex = UnityObjectToClipPos(v); \
o.normal = UnityObjectToWorldNormal(n); \
TriStream.Append(o);
#define ADD_TRI(p0, p1, p2, n) \
ADD_VERT(p0, n) ADD_VERT(p1, n) \
ADD_VERT(p2, n) \
TriStream.RestartStrip();
[maxvertexcount(36)]
void geom(triangle appdata IN[3], inout TriangleStream<g2f> TriStream)
{
//ポリゴンの中心を計算。
float3 center = (IN[0].vertex + IN[1].vertex + IN[2].vertex).xyz / 3;
float2 uv = (IN[0].uv + IN[1].uv + IN[2].uv) / 3;
g2f o;
o.uv=uv;
float scale = _BoxScale;
//頂点生成
float4 v0 = float4( 1, 1, 1,1)*scale + float4(center.xyz,0);
float4 v1 = float4( 1, 1,-1,1)*scale + float4(center.xyz,0);
float4 v2 = float4( 1,-1, 1,1)*scale + float4(center.xyz,0);
float4 v3 = float4( 1,-1,-1,1)*scale + float4(center.xyz,0);
float4 v4 = float4(-1, 1, 1,1)*scale + float4(center.xyz,0);
float4 v5 = float4(-1, 1,-1,1)*scale + float4(center.xyz,0);
float4 v6 = float4(-1,-1, 1,1)*scale + float4(center.xyz,0);
float4 v7 = float4(-1,-1,-1,1)*scale + float4(center.xyz,0);
//法線
float3 n0 = float3( 1, 0, 0);
float3 n1 = float3(-1, 0, 0);
float3 n2 = float3( 0, 1, 0);
float3 n3 = float3( 0,-1, 0);
float3 n4 = float3( 0, 0, 1);
float3 n5 = float3( 0, 0,-1);
//ポリゴン生成
ADD_TRI(v0, v2, v3, n0);
ADD_TRI(v3, v1, v0, n0);
ADD_TRI(v5, v7, v6, n1);
ADD_TRI(v6, v4, v5, n1);
ADD_TRI(v4, v0, v1, n2);
ADD_TRI(v1, v5, v4, n2);
ADD_TRI(v7, v3, v2, n3);
ADD_TRI(v2, v6, v7, n3);
ADD_TRI(v6, v2, v0, n4);
ADD_TRI(v0, v4, v6, n4);
ADD_TRI(v5, v1, v3, n5);
ADD_TRI(v3, v7, v5, n5);
}
fixed4 frag (g2f i) : SV_Target
{
fixed4 col=tex2D(_MainTex, i.uv)*_MainColor;
return col;
}
ENDCG
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment