| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // RUN: %dxc -E main -T gs_6_0 %s | FileCheck %s
- // CHECK: storeOutput
- // CHECK: emitStream
- // CHECK: cutStream
- //--------------------------------------------------------------------------------------
- // 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),
- };
- };
- //
- // GS for rendering point sprite particles. Takes a point and turns it into 2 tris.
- //
- [maxvertexcount(4)]
- void main(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();
- }
|