Last active
September 18, 2018 18:01
-
-
Save TheStoneBook/8dfef6c5e5313e24da5c23eb8378a0f5 to your computer and use it in GitHub Desktop.
【Unity】ポリゴンをボクセルに【Shader】
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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