aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Media/SampleRenderer/4/shaders/vertex/particle_fog.cg
blob: e7663be5801297e119a431c0b8ede8ff099217c9 (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
#include <config.cg>
#include <globals.cg>

struct VertexOut
{
	FragmentParameters params;
	float4             screenSpacePosition : POSITION;
	float              pointSize           : PSIZE;
};

BEGIN_CBUFFER(cbParticlesFog)
CONST_TYPE float windowWidth;
END_CBUFFER(cbParticlesFog)

VertexOut  vmain(__in(float4,     localSpacePosition, POSITION)
                 __in_opt(float3, localSpaceNormal,   NORMAL)
                 __in_opt(float4, localSpaceTangent,  SEMANTIC_TANGENT)
                 __in_opt(float4, vertexTexcoord0,    TEXCOORD0)
                 __in_opt(float4, vertexTexcoord1,    TEXCOORD1)
                 __in_opt(float4, vertexTexcoord2,    TEXCOORD2)
                 __in_opt(float4, vertexTexcoord3,    TEXCOORD3)
                 __in_opt(half4,  vertexColor,        COLOR)
               #if RENDERER_INSTANCED
                 , __in(float3,   instanceOffset,     SEMANTIC_INSTANCE_T)
                 , __in(float3,   instanceNormalX,    SEMANTIC_INSTANCE_X)
                 , __in(float3,   instanceNormalY,    SEMANTIC_INSTANCE_Y)
                 , __in(float3,   instanceNormalZ,    SEMANTIC_INSTANCE_Z)
               #endif
                )
{
	VertexOut vout;
	
	float4x4 modelMatrix;
#if RENDERER_INSTANCED
	modelMatrix = transpose(float4x4(float4(instanceNormalX, 0), float4(instanceNormalY, 0), float4(instanceNormalZ, 0), float4(instanceOffset, 1)));
#else
	modelMatrix = g_modelMatrix;
#endif
	
	float4x4 mvm                   = mul(g_viewMatrix, modelMatrix);
	float4x4 mvpm                  = mul(g_projMatrix, mvm);
	vout.screenSpacePosition       = mul(mvpm, localSpacePosition);
	
	vout.params.worldSpacePosition = mul(g_modelMatrix, localSpacePosition).xyz;
	vout.params.worldSpaceNormal   = normalize(mul(modelMatrix, float4(localSpaceNormal,    0)).xyz);
	vout.params.worldSpaceTangent  = normalize(mul(g_modelMatrix, float4(localSpaceTangent.xyz, 0)).xyz);
	vout.params.worldSpaceBinormal = cross(vout.params.worldSpaceNormal, vout.params.worldSpaceTangent) * localSpaceTangent.w;
	
	vout.params.texcoord0   = vertexTexcoord0;
	vout.params.texcoord1   = vertexTexcoord1;
	vout.params.texcoord2   = vertexTexcoord2;
#if !defined (RENDERER_WIN8ARM)		
	vout.params.texcoord3   = vertexTexcoord3;
#endif	
	vout.params.color       = vertexTexcoord1;
	
	// saturate density range...
	const float minDensity = 900;
	const float maxDensity = 2500;
	vout.params.color.r = sqrt(saturate((vout.params.color.r - minDensity) / (maxDensity-minDensity)));
	
	vout.pointSize          = (g_projMatrix[0][0] / vout.screenSpacePosition.w) * (windowWidth / 2.0) * 1.0;// * (1-0.5*vout.params.color.r);
	
	return vout;
}