-
Notifications
You must be signed in to change notification settings - Fork 867
Expand file tree
/
Copy pathChartRasterizerSoftware.shader
More file actions
61 lines (51 loc) · 1.8 KB
/
ChartRasterizerSoftware.shader
File metadata and controls
61 lines (51 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Shader "Hidden/ChartRasterizerSoftware"
{
SubShader
{
Pass
{
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "GeometryUtils.hlsl"
#define PARALLEL_EPS 1e-6f
struct v2f
{
float4 vertex : SV_POSITION;
nointerpolation uint chartId : TEXCOORD0;
nointerpolation float4 aabb : TEXCOORD1;
};
uint g_Width;
uint g_Height;
float4 g_ScaleAndOffset;
uint g_ChartIndexOffset;
StructuredBuffer<float2> g_VertexBuffer;
StructuredBuffer<uint> g_VertexToOriginalVertex;
StructuredBuffer<uint> g_VertexToChartID;
v2f vert (uint vertexId : SV_VertexID)
{
v2f o;
// Expand the triangle.
uint2 resolution = uint2(g_Width, g_Height);
float2 tri[3];
ReadParentTriangle(g_VertexBuffer, vertexId, g_ScaleAndOffset, tri);
ExpandTriangleForConservativeRasterization(resolution, tri, vertexId, o.aabb, o.vertex, PARALLEL_EPS);
// Get the chart index.
uint originalVertexId = g_VertexToOriginalVertex[vertexId];
o.chartId = g_VertexToChartID[originalVertexId];
return o;
}
float frag (v2f i) : SV_Target
{
// Clip overly conservative edges.
float2 pos = i.vertex.xy;
if (pos.x < i.aabb.x || pos.y < i.aabb.y ||
pos.x > i.aabb.z || pos.y > i.aabb.w)
discard;
return g_ChartIndexOffset + i.chartId;
}
ENDCG
}
}
}