Hey guys,
I’m having issues getting geometry shaders to work properly.
I’m trying to implement a billboard particle shader using this code:
Shader Code
Shader "Custom/SpriteParticleTest"
{
Properties
{
_Sprite("Sprite", 2D) = "white" {}
_Color("Color", Color) = (0.38,0.26,0.98,1.0)
_Size("Size", float) = 0.1
}
SubShader
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
Blend SrcAlpha One
AlphaTest Greater .01
ColorMask RGB
Cull Off Lighting Off ZWrite Off
Pass
{
CGPROGRAM
#pragma target 5.0
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
float _Size;
sampler2D _Sprite;
struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2g
{
float4 pos : SV_POSITION;
fixed4 color : COLOR;
};
v2g vert(appdata_t v)
{
v2g OUT;
OUT.pos = mul (UNITY_MATRIX_MVP, float4(v.vertex.xyz,1.0f));
OUT.color = _Color;
return OUT;
}
struct g2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 color : COLOR;
};
[maxvertexcount(4)]
void geom(point v2g IN[1], inout TriangleStream<g2f> outStream)
{
float dx = _Size;
float dy = _Size * _ScreenParams.x / _ScreenParams.y;
g2f OUT;
OUT.pos = IN[0].pos + float4(-dx, dy,0,0); OUT.uv=float2(0,0); OUT.color = IN[0].color; outStream.Append(OUT);
OUT.pos = IN[0].pos + float4( dx, dy,0,0); OUT.uv=float2(1,0); OUT.color = IN[0].color; outStream.Append(OUT);
OUT.pos = IN[0].pos + float4(-dx,-dy,0,0); OUT.uv=float2(0,1); OUT.color = IN[0].color; outStream.Append(OUT);
OUT.pos = IN[0].pos + float4( dx,-dy,0,0); OUT.uv=float2(1,1); OUT.color = IN[0].color; outStream.Append(OUT);
outStream.RestartStrip();
}
float4 frag (g2f IN) : COLOR
{
fixed4 col = 2.0f * IN.color * _Color * tex2D(_Sprite, IN.uv);
return col;
}
ENDCG
}
}
Fallback Off
}
The goal is to render a particle sprite for every vertex of the mesh that uses this shader. However the geometry shader doesn’t seem to get invoked for every vertex. When I create a material with this shader and attach it to a cube it produces the following output:
As you can see the geometry shader doesn’t output quads for some of the vertices. Also the lower right vertex seems to produce multiple quads (since it’s brighter and I’m using additive blending).
To me it looks like the GS somehow receives triangles as an input even though I specified “point” as the GS primitive. Maybe I’m totally wrong though.
Any help appreciated!