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
|
#include "shaderCommon.h"
cbuffer constBuf : register(b0)
{
FluidShaderConst gParams;
};
static const float2 corners[4] =
{
float2(0.0, 1.0), float2(0.0, 0.0), float2(1.0, 1.0), float2(1.0, 0.0)
};
[maxvertexcount(4)]
void pointThicknessGS(point FluidVertexOut input[1], inout TriangleStream<FluidGeoOut> triStream)
{
float4 gl_Position;
float4 gl_TexCoord[4];
{
[unroll]
for (int i = 0; i < 4; i++)
gl_TexCoord[i] = float4(0.0f, 0.0f, 0.0f, 0.0f);
}
const float4x4 gl_ModelViewMatrix = gParams.modelView;
const float pointRadius = gParams.pointRadius;
//const float pointScale = gParams.pointScale;
float4 viewPos = input[0].position;
float4 gl_Vertex = input[0].bounds; // retrieve gl_Vertex from bounds
//float spriteSize = pointScale * (pointRadius / gl_Position.w);
float spriteSize = pointRadius * 2;
FluidGeoOut output;
for (int i = 0; i < 4; ++i)
{
float4 eyePos = viewPos; // start with point position
eyePos.xy += spriteSize * (corners[i] - float2(0.5, 0.5)); // add corner position
gl_Position = mul(gParams.projection, eyePos); // complete transformation
gl_TexCoord[0].xy = corners[i].xy; // use corner as texCoord
gl_TexCoord[0].y = 1.0f - gl_TexCoord[0].y; // flip the y component of uv (glsl to hlsl conversion)
//gl_TexCoord[1] = mul(gl_ModelViewMatrix, float4(gl_Vertex.xyz, 1.0));
output.position = gl_Position;
//[unroll]
//for (int j = 0; j < 4; j++)
// output.texCoord[j] = gl_TexCoord[j];
output.invQ0 = gl_TexCoord[0];
output.invQ1 = gl_TexCoord[1];
output.invQ2 = gl_TexCoord[2];
output.invQ3 = gl_TexCoord[3];
triStream.Append(output);
}
}
|