aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d/shaders/pointGS.hlsl
blob: 4d654afb947d3bee20c6c38eb6cfb2a1c9d309fc (plain) (blame)
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
#include "shaderCommon.h"

cbuffer constBuf : register(b0)
{
	PointShaderConst 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 pointGS(point PointVertexOut input[1], inout TriangleStream<PointGeoOut> triStream)
{
	const float4x4 modelViewMatrix = gParams.modelView;
	const float pointRadius = gParams.pointRadius;
	const float pointScale = gParams.pointScale;
	const float4x4 lightTransform = gParams.lightTransform;
	const float3 lightDir = gParams.lightDir.xyz;
	const int mode = gParams.mode;

	const float4 viewPosition = input[0].viewPosition;
	const float density = input[0].density;
	const unsigned int phase = input[0].phase;
	const float4 modelPosition = input[0].modelPosition;

	//float spriteSize = (pointRadius / viewPos.z);
	const float spriteSize = pointRadius * 2;

	PointGeoOut output;
	for (int i = 0; i < 4; ++i)
	{
		const float2 corner = corners[i];
		float4 eyePos = viewPosition;									// start with point position
		eyePos.xy += spriteSize * (corner - float2(0.5, 0.5));		// add corner position
		output.position = mul(gParams.projection, eyePos);			// complete transformation

		// use corner as texCoord,  flip the y component of uv (glsl to hlsl conversion)
		output.texCoord = float2(corner.x, 1.0f - corner.y);
		output.lightOffsetPosition = mul(lightTransform, float4(modelPosition.xyz - lightDir * pointRadius * 2.0, 1.0));
		output.viewLightDir = mul(modelViewMatrix, float4(lightDir, 0.0)).xyz;

		if (mode == 1)
		{
			// density visualization
			if (density < 0.0f)
				output.reflectance = float4(lerp(float3(0.1, 0.1, 1.0), float3(0.1, 1.0, 1.0), -density), 0);
			else
				output.reflectance = float4(lerp(float3(1.0, 1.0, 1.0), float3(0.1, 0.2, 1.0), density), 0);
		}
		else if (mode == 2)
		{
			//gl_PointSize *= clamp(inPosition.w * 0.25, 0.0f, 1.0);
			float tmp = clamp(modelPosition.w * 0.05, 0.0f, 1.0);
			output.reflectance = float4(tmp, tmp, tmp, tmp);
		}
		else
		{
			output.reflectance = float4(lerp(gParams.colors[phase % 8].xyz * 2.0, float3(1.0, 1.0, 1.0), 0.1), 0);
		}

		output.modelPosition= modelPosition.xyz;
		output.viewPosition = viewPosition.xyz;

		triStream.Append(output);
	}
}