Files
Seele/res/shaders/ForwardPlus.slang
T
2023-08-28 21:23:13 +02:00

69 lines
1.9 KiB
Plaintext

import Common;
import LightEnv;
import BRDF;
import Material;
import StaticMeshVertexInput;
import PrimitiveSceneData;
import MaterialParameter;
layout(set = INDEX_LIGHT_ENV, binding = 4)
ShaderBuffer<uint> lightIndexList;
layout(set = INDEX_LIGHT_ENV, binding = 5)
RWTexture2D<uint2> lightGrid;
struct VertexStageOutput
{
VertexValueCache cache : ShaderCache;
float4 position : SV_Position;
};
[shader("vertex")]
VertexStageOutput vertexMain(
VertexShaderInput input)
{
VertexStageOutput output;
VertexValueCache cache = input.getVertexCache();
float3 worldPosition = input.getWorldPosition();
//worldPosition += gMaterial.getWorldOffset();
float4 viewSpacePosition = mul(gViewParams.viewMatrix, float4(worldPosition, 1));
MaterialVertexParameter vertexParams = input.getMaterialVertexParameters(cache, worldPosition, viewSpacePosition.xyz);
float4 clipSpacePosition = mul(gViewParams.projectionMatrix, viewSpacePosition);
output.position = clipSpacePosition;
output.cache = cache;
return output;
}
[shader("fragment")]
float4 fragmentMain(
VertexValueCache cache : ShaderCache,
float4 position : SV_Position
) : SV_Target
{
MaterialFragmentParameter materialParams = cache.getFragmentParameters();
let brdf = gMaterial.prepare(materialParams);
float3 result = float3(0, 0, 0);
for (int i = 0; i < numDirectionalLights; i++)
{
result += directionalLights[i].illuminate(materialParams, brdf);
}
uint2 tileIndex = uint2(floor(position.xy / BLOCK_SIZE));
uint2 gridValue = lightGrid[tileIndex];
uint startOffset = gridValue.x;
uint lightCount = gridValue.y;
for (int j = 0; j < numPointLights; ++j)
{
//uint lightIndex = lightIndexList[startOffset + j];
PointLight pointLight = pointLights[j];
result += pointLight.illuminate(materialParams, brdf);
}
return float4(result + float3(0.4f, 0.4f, 0), 0.7f);
}