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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
//TEST_IGNORE_FILE: Currently failing due to Spire compiler issues.
//TEST:COMPARE_HLSL: -target dxbc-assembly -profile vs_4_0 -entry VSParticleDraw -profile gs_4_0 -entry GSParticleDraw -profile ps_4_0 -entry PSParticleDraw
//--------------------------------------------------------------------------------------
// File: ParticleDraw.hlsl
//
// Shaders for rendering the particle as point sprite
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
struct VSParticleIn
{
float4 color : COLOR;
uint id : SV_VERTEXID;
};
struct VSParticleDrawOut
{
float3 pos : POSITION;
float4 color : COLOR;
};
struct GSParticleDrawOut
{
float2 tex : TEXCOORD0;
float4 color : COLOR;
float4 pos : SV_POSITION;
};
struct PSParticleDrawIn
{
float2 tex : TEXCOORD0;
float4 color : COLOR;
};
struct PosVelo
{
float4 pos;
float4 velo;
};
Texture2D g_txDiffuse;
StructuredBuffer<PosVelo> g_bufPosVelo;
SamplerState g_samLinear
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
cbuffer cb0
{
row_major float4x4 g_mWorldViewProj;
row_major float4x4 g_mInvView;
};
cbuffer cb1
{
static float g_fParticleRad = 10.0f;
};
cbuffer cbImmutable
{
static float3 g_positions[4] =
{
float3( -1, 1, 0 ),
float3( 1, 1, 0 ),
float3( -1, -1, 0 ),
float3( 1, -1, 0 ),
};
static float2 g_texcoords[4] =
{
float2(0,0),
float2(1,0),
float2(0,1),
float2(1,1),
};
};
//
// Vertex shader for drawing the point-sprite particles
//
VSParticleDrawOut VSParticleDraw(VSParticleIn input)
{
VSParticleDrawOut output;
output.pos = g_bufPosVelo[input.id].pos;
float mag = g_bufPosVelo[input.id].velo.w/9;
output.color = lerp( float4(1,0.1,0.1,1), input.color, mag );
return output;
}
//
// GS for rendering point sprite particles. Takes a point and turns it into 2 tris.
//
[maxvertexcount(4)]
void GSParticleDraw(point VSParticleDrawOut input[1], inout TriangleStream<GSParticleDrawOut> SpriteStream)
{
GSParticleDrawOut output;
//
// Emit two new triangles
//
for(int i=0; i<4; i++)
{
float3 position = g_positions[i] * g_fParticleRad;
position = mul( position, (float3x3)g_mInvView ) + input[0].pos;
output.pos = mul( float4(position,1.0), g_mWorldViewProj );
output.color = input[0].color;
output.tex = g_texcoords[i];
SpriteStream.Append(output);
}
SpriteStream.RestartStrip();
}
//
// PS for drawing particles
//
float4 PSParticleDraw(PSParticleDrawIn input) : SV_Target
{
return g_txDiffuse.Sample( g_samLinear, input.tex ) * input.color;
}
|