123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /////////////
- // GLOBALS //
- /////////////
- cbuffer MatrixBuffer : register(b0)
- {
- matrix knochenMatrix[128];
- };
- // The projection and view matrix
- cbuffer Kamera : register(b1)
- {
- matrix view;
- matrix projection;
- }
- cbuffer LightController : register(b2)
- {
- uint lightLength;
- float dayLightFactor;
- }
- // stores the light for two verticies
- struct VertexLight
- {
- uint dayLight1;
- uint dynamicLight1;
- uint dayLight2;
- uint dynamicLight2;
- };
- StructuredBuffer<VertexLight> lightBuffer : register(t0);
- //////////////
- // TYPEDEFS //
- //////////////
- struct VertexInputType
- {
- float4 position : POSITION;
- float2 tex : TEXCOORD0;
- float3 normal : NORMAL;
- uint knochen : KNOCHEN_ID0;
- uint id : VERTEX_ID0;
- };
- struct PixelInputType
- {
- float4 worldPos : POSITION;
- float4 position : SV_POSITION;
- float2 tex : TEXCOORD0;
- float3 normal : TEXCOORD1;
- float4 light1 : TEXCOORD2;
- float4 light2 : TEXCOORD3;
- };
- ////////////////////////////////////////////////////////////////////////////////
- // Vertex Shader
- ////////////////////////////////////////////////////////////////////////////////
- PixelInputType TextureVertexShader(VertexInputType input)
- {
- // return input;
- PixelInputType output;
- output.normal
- = normalize(mul(input.normal, (float3x3)knochenMatrix[input.knochen]));
- // Change the position vector to be 4 units for proper matrix calculations.
- input.position.w = 1.0f;
- // Store the texture coordinates for the pixel shader.
- output.tex = input.tex;
- // Calculate the position of the vertex against the world, view, and
- // projection matrices.
- output.worldPos = mul(input.position, knochenMatrix[input.knochen]);
- output.position = mul(output.worldPos, view);
- output.position = mul(output.position, projection);
- output.light1 = float4(1.0f, 1.0f, 1.0f, 0.f);
- output.light2 = float4(0.0f, 0.0f, 0.0f, 0.f);
- uint dayLight = 0;
- uint dynamicLight = 0;
- if (lightLength == 1)
- {
- dayLight = lightBuffer[0].dayLight1;
- dynamicLight = lightBuffer[0].dynamicLight1;
- }
- else if (input.id < lightLength)
- {
- if (input.id % 2 == 0)
- {
- dayLight = lightBuffer[input.id / 2].dayLight1;
- dynamicLight = lightBuffer[input.id / 2].dynamicLight1;
- }
- else
- {
- dayLight = lightBuffer[input.id / 2].dayLight2;
- dynamicLight = lightBuffer[input.id / 2].dynamicLight2;
- }
- }
- if (lightLength > 0 && input.id < lightLength)
- {
- output.light1.x = (((dayLight >> 24) & 0xFF) / 255.f) * dayLightFactor;
- output.light1.y = (((dayLight >> 16) & 0xFF) / 255.f) * dayLightFactor;
- output.light1.z = (((dayLight >> 8) & 0xFF) / 255.f) * dayLightFactor;
- output.light2.x = ((dynamicLight >> 24) & 0xFF) / 255.f;
- output.light2.y = ((dynamicLight >> 16) & 0xFF) / 255.f;
- output.light2.z = ((dynamicLight >> 8) & 0xFF) / 255.f;
- output.light1.w = 1.f;
- }
- return output;
- }
|