Progress i guess

This commit is contained in:
Dynamitos
2023-11-08 23:27:21 +01:00
parent ecb5050dc7
commit 19c3e559b1
49 changed files with 268 additions and 361 deletions
+8 -8
View File
@@ -11,21 +11,21 @@ struct LightCullingData
RWTexture2D<uint2> oLightGrid;
RWTexture2D<uint2> tLightGrid;
};
ParameterBuffer<LightCullingData> gLightCullingData;
ParameterBlock<LightCullingData> pLightCullingData;
[shader("pixel")]
void pixelMain(in VertexAttributes attribs, out float4 baseColor)
{
MaterialParameter params = MaterialParameter.create(attribs);
BRDF brdf = gMaterial.prepare(params);
MaterialParameter params = attribs.create();
BRDF brdf = pMaterial.prepare(params);
float3 result = float3(0, 0, 0);
for(int i = 0; i < gLightEnv.numDirectionalLights; ++i)
for(int i = 0; i < pLightEnv.numDirectionalLights; ++i)
{
result += gLightEnv.directionalLights[i].illuminate(params, brdf);
result += pLightEnv.directionalLights[i].illuminate(params, brdf);
}
for(int i = 0; i < gLightEnv.numPointLights; ++i)
for(int i = 0; i < pLightEnv.numPointLights; ++i)
{
result += gLightEnv.pointLights[i].illuminate(params, brdf);
result += pLightEnv.pointLights[i].illuminate(params, brdf);
}
return float4(result, 1.0f);
return float4(1, 1, 0, 1.0f);
}
+5 -30
View File
@@ -14,43 +14,18 @@ struct DispatchParams
uint pad0;
uint3 numThreads;
uint pad1;
RWShaderBuffer<Frustum> frustums;
RWStructuredBuffer<Frustum> frustums;
}
ParameterBuffer<DispatchParams> dispatchParams;
ParameterBlock<DispatchParams> pDispatchParams;
[numthreads(BLOCK_SIZE, BLOCK_SIZE, 1)]
[shader("compute")]
void computeFrustums(ComputeShaderInput in)
{
const float3 eyePos = float3(0,0,0);
float4 screenSpace[4];
screenSpace[0] = float4(in.dispatchThreadID.xy * BLOCK_SIZE, -1.0f, 1.0f);
screenSpace[1] = float4(float2(in.dispatchThreadID.x + 1, in.dispatchThreadID.y) * BLOCK_SIZE, -1.0f, 1.0f);
screenSpace[2] = float4(float2(in.dispatchThreadID.x, in.dispatchThreadID.y + 1) * BLOCK_SIZE, -1.0f, 1.0f);
screenSpace[3] = float4(float2(in.dispatchThreadID.x + 1, in.dispatchThreadID.y + 1) * BLOCK_SIZE, -1.0f, 1.0f);
//Convert to viewSpace
float3 viewSpace[4];
for(int i = 0; i < 4; i++)
if(in.dispatchThreadID.x < pDispatchParams.numThreads.x && in.dispatchThreadID.y < pDispatchParams.numThreads.y)
{
viewSpace[i] = screenToClip(screenSpace[i]).xyz;
}
//Compute frustum
Frustum frustum;
frustum.planes[0] = computePlane(eyePos, viewSpace[2], viewSpace[0]);
frustum.planes[1] = computePlane(eyePos, viewSpace[1], viewSpace[3]);
frustum.planes[2] = computePlane(eyePos, viewSpace[0], viewSpace[1]);
frustum.planes[3] = computePlane(eyePos, viewSpace[3], viewSpace[2]);
if(in.dispatchThreadID.x < dispatchParams.numThreads.x && in.dispatchThreadID.y < dispatchParams.numThreads.y)
{
uint index = in.dispatchThreadID.x + (in.dispatchThreadID.y * numThreads.x);
dispatchParams.frustums[index] = frustum;
uint index = in.dispatchThreadID.x + (in.dispatchThreadID.y * pDispatchParams.numThreads.x);
//pDispatchParams.frustums[index] = frustum;
}
}
-24
View File
@@ -1,24 +0,0 @@
import Common;
import Material;
import PrimitiveSceneData;
import StaticMeshVertexInput;
struct VertexStageOutput
{
float4 position : SV_Position;
}
[shader("vertex")]
VertexStageOutput vertexMain(PositionOnlyVertexShaderInput input)
{
VertexStageOutput output;
float3 worldPosition = input.getWorldPosition();
//worldPosition += gMaterial.getWorldOffset();
float4 clipSpacePosition;
float4 viewSpacePosition = mul(gViewParams.viewMatrix, float4(worldPosition, 1));
clipSpacePosition = mul(gViewParams.projectionMatrix, viewSpacePosition);
output.position = clipSpacePosition;
return output;
}
+4 -5
View File
@@ -1,5 +1,4 @@
import VertexData;
import StaticMeshVertexData;
struct InstanceData
{
@@ -11,14 +10,14 @@ struct Scene
StructuredBuffer<InstanceData> instances;
}
ParameterBlock<Scene> scene;
ParameterBlock<Scene> pScene;
[shader("vertex")]
StaticMeshVertexAttributes vertexMain(
IVertexAttributes vertexMain(
uint vertexId: SV_VertexID,
uint instanceId: SV_InstanceID,
){
InstanceData inst = scene.instances[instanceId];
StaticMeshVertexAttributes attr = vertexData.getAttributes(vertexId, inst.transformMatrix);
InstanceData inst = pScene.instances[instanceId];
IVertexAttributes attr = pVertexData.getAttributes(vertexId, inst.transformMatrix);
return attr;
}
+11 -11
View File
@@ -28,7 +28,7 @@ struct CullingParams
StructuredBuffer<Frustum> frustums;
};
ParameterBlock<CullingParams> gCullingParams;
ParameterBlock<CullingParams> pCullingParams;
// Debug
//Texture2D lightCountHeatMap;
//RWTexture2D<float4> debugTexture;
@@ -72,7 +72,7 @@ void tAppendLight(uint lightIndex)
void cullLights(ComputeShaderInput in)
{
int2 texCoord = int2(in.dispatchThreadID.xy);
float fDepth = gCullingParams.depthTextureVS.Load(int3(texCoord, 0)).r;
float fDepth = pCullingParams.depthTextureVS.Load(int3(texCoord, 0)).r;
uint uDepth = asuint(fDepth);
if(in.groupIndex == 0)
@@ -81,7 +81,7 @@ void cullLights(ComputeShaderInput in)
uMaxDepth = 0x0;
oLightCount = 0;
tLightCount = 0;
groupFrustum = gCullingParams.frustums[in.groupID.x + (in.groupID.y * gCullingParams.numThreadGroups.x)];
groupFrustum = pCullingParams.frustums[in.groupID.x + (in.groupID.y * pCullingParams.numThreadGroups.x)];
}
GroupMemoryBarrierWithGroupSync();
@@ -100,9 +100,9 @@ void cullLights(ComputeShaderInput in)
Plane minPlane = {float3(0, 0, -1), -minDepthVS};
for ( uint i = in.groupIndex; i < gLightEnv.numPointLights; i += BLOCK_SIZE * BLOCK_SIZE )
for ( uint i = in.groupIndex; i < pLightEnv.numPointLights; i += BLOCK_SIZE * BLOCK_SIZE )
{
PointLight light = gLightEnv.pointLights[i];
PointLight light = pLightEnv.pointLights[i];
//TODO: why doesn't this check go through?
//if(light.insideFrustum(groupFrustum, nearClipVS, maxDepthVS))
{
@@ -118,23 +118,23 @@ void cullLights(ComputeShaderInput in)
if(in.groupIndex == 0)
{
InterlockedAdd(gCullingParams.oLightIndexCounter[0], oLightCount, oLightIndexStartOffset);
gCullingParams.oLightGrid[in.groupID.xy] = uint2(oLightIndexStartOffset, oLightCount);
InterlockedAdd(pCullingParams.oLightIndexCounter[0], oLightCount, oLightIndexStartOffset);
pCullingParams.oLightGrid[in.groupID.xy] = uint2(oLightIndexStartOffset, oLightCount);
InterlockedAdd(gCullingParams.tLightIndexCounter[0], tLightCount, tLightIndexStartOffset);
gCullingParams.tLightGrid[in.groupID.xy] = uint2(tLightIndexStartOffset, tLightCount);
InterlockedAdd(pCullingParams.tLightIndexCounter[0], tLightCount, tLightIndexStartOffset);
pCullingParams.tLightGrid[in.groupID.xy] = uint2(tLightIndexStartOffset, tLightCount);
}
GroupMemoryBarrierWithGroupSync();
for (uint j = in.groupIndex; j < oLightCount; j += BLOCK_SIZE * BLOCK_SIZE)
{
gCullingParams.oLightIndexList[oLightIndexStartOffset + j] = oLightList[j];
pCullingParams.oLightIndexList[oLightIndexStartOffset + j] = oLightList[j];
}
// For transparent geometry.
for ( uint k = in.groupIndex; k < tLightCount; k += BLOCK_SIZE * BLOCK_SIZE )
{
gCullingParams.tLightIndexList[tLightIndexStartOffset + k] = tLightList[k];
pCullingParams.tLightIndexList[tLightIndexStartOffset + k] = tLightList[k];
}
+17 -17
View File
@@ -22,11 +22,11 @@ void taskMain(
uint threadID: SV_GroupIndex,
uint groupID: SV_GroupID
){
InstanceData instance = scene.instances[groupID];
InstanceData instance = pScene.instances[groupID];
if(threadID == 0)
{
head = 0;
localToClip = mul(viewParams.projectionMatrix, mul(viewParams.viewMatrix, instance.transformMatrix));
localToClip = mul(pViewParams.projectionMatrix, mul(pViewParams.viewMatrix, instance.transformMatrix));
// Left
viewFrustum.sides[0].n = float3(1, 0, 0);
viewFrustum.sides[0].d = -1;
@@ -44,11 +44,11 @@ void taskMain(
viewFrustum.basePlane.d = 0;
}
GroupMemoryBarrierWithGroupSync();
MeshData mesh = scene.meshData[groupID];
MeshData mesh = pScene.meshData[groupID];
for(uint i = threadID; i < MAX_MESHLETS_PER_MESH; i += TASK_GROUP_SIZE)
{
uint m = mesh.meshletOffset + min(mesh.numMeshlets, i);
MeshletDescription meshlet = scene.meshlets.meshletInfos[m];
MeshletDescription meshlet = pScene.meshlets.meshletInfos[m];
//if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum))
{
uint index;
@@ -61,7 +61,7 @@ void taskMain(
DispatchMesh(head, 1, 1, p);
}
groupshared VertexAttributes gs_vertices[MAX_VERTICES];
groupshared IVertexAttributes gs_vertices[MAX_VERTICES];
groupshared uint3 gs_indices[MAX_PRIMITIVES];
groupshared uint gs_numVertices;
groupshared uint gs_numPrimitives;
@@ -78,12 +78,12 @@ void meshMain(
in uint threadID: SV_GroupIndex,
in uint groupID: SV_GroupID,
in payload MeshPayload meshPayload,
out Vertices<VertexAttributes, MAX_VERTICES> vertices,
out Vertices<IVertexAttributes, MAX_VERTICES> vertices,
out Indices<uint3, MAX_PRIMITIVES> indices
){
InstanceData inst = scene.instances[meshPayload.instanceId[groupID]];
MeshData md = scene.meshData[meshPayload.instanceId[groupID]];
MeshletDescription m = meshlets.meshletInfos[meshPayload.meshletId[groupID]];
InstanceData inst = pScene.instances[meshPayload.instanceId[groupID]];
MeshData md = pScene.meshData[meshPayload.instanceId[groupID]];
MeshletDescription m = pScene.meshletInfos[meshPayload.meshletId[groupID]];
const uint vertexLoops = (MAX_VERTICES + MESH_GROUP_SIZE - 1) / MESH_GROUP_SIZE;
for(uint loop = 0; loop < vertexLoops; ++loop)
{
@@ -91,8 +91,8 @@ void meshMain(
v = min(v, m.vertexCount - 1);
InterlockedMax(gs_numVertices, v + 1);
{
int vertexIndex = meshlets.vertexIndices[m.vertexOffset + v];
gs_vertices[v] = vertexData.getAttributes(md.indexOffset + vertexIndex, inst);
int vertexIndex = pScene.vertexIndices[m.vertexOffset + v];
gs_vertices[v] = pVertexData.getAttributes(md.indexOffset + vertexIndex, inst);
}
}
@@ -103,12 +103,12 @@ void meshMain(
p = min(p, m.primitiveCount - 1);
InterlockedMax(gs_numPrimitives, p + 1);
{
uint8_t local_idx0 = meshlets.primitiveIndices[m.primitiveOffset + (p * 3) + 0];
uint8_t local_idx1 = meshlets.primitiveIndices[m.primitiveOffset + (p * 3) + 1];
uint8_t local_idx2 = meshlets.primitiveIndices[m.primitiveOffset + (p * 3) + 2];
uint32_t idx0 = meshlets.vertexIndices[m.vertexOffset + local_idx0];
uint32_t idx1 = meshlets.vertexIndices[m.vertexOffset + local_idx1];
uint32_t idx2 = meshlets.vertexIndices[m.vertexOffset + local_idx2];
uint8_t local_idx0 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 0];
uint8_t local_idx1 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 1];
uint8_t local_idx2 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 2];
uint32_t idx0 = pScene.vertexIndices[m.vertexOffset + local_idx0];
uint32_t idx1 = pScene.vertexIndices[m.vertexOffset + local_idx1];
uint32_t idx2 = pScene.vertexIndices[m.vertexOffset + local_idx2];
gs_indices[p * 3 + 0] = idx0;
gs_indices[p * 3 + 1] = idx1;
gs_indices[p * 3 + 2] = idx2;
+8 -8
View File
@@ -15,17 +15,17 @@ struct SkyboxData
float4x4 transformMatrix;
float4 fogBlend;
};
ParameterBuffer<SkyboxData> gSkyboxData;
ParameterBlock<SkyboxData> pSkyboxData;
[shader("vertex")]
VertexShaderOutput vertexMain(
VertexShaderInput input)
{
VertexShaderOutput output;
float3x3 cameraRotation = float3x3(gViewParams.viewMatrix);
float3x3 cameraRotation = float3x3(pViewParams.viewMatrix);
float4 worldPos = float4(mul(cameraRotation, input.position), 1.0f);
//clip(dot(worldPos, clipPlane));
output.clipPos = mul(gViewParams.projectionMatrix, worldPos);
output.clipPos = mul(pViewParams.projectionMatrix, worldPos);
output.texCoords = normalize(input.position);
return output;
}
@@ -36,7 +36,7 @@ struct TextureData
TextureCube cubeMap2;
SamplerState sampler;
};
ParameterBuffer<TextureData> textures;
ParameterBlock<TextureData> pTextures;
static const float lowerLimit = 0.0;
static const float upperLimit = 0.1;
@@ -44,11 +44,11 @@ static const float upperLimit = 0.1;
float4 fragmentMain(
VertexShaderOutput output) : SV_Target
{
float4 texture1 = textures.cubeMap.Sample(textures.sampler, output.texCoords);
float4 texture2 = textures.cubeMap2.Sample(textures.sampler, output.texCoords);
float4 finalColor = lerp(texture1, texture2, gSkyboxData.fogBlend.w);
float4 texture1 = pTextures.cubeMap.Sample(pTextures.sampler, output.texCoords);
float4 texture2 = pTextures.cubeMap2.Sample(pTextures.sampler, output.texCoords);
float4 finalColor = lerp(texture1, texture2, pSkyboxData.fogBlend.w);
float factor = (output.texCoords.y - lowerLimit) / (upperLimit - lowerLimit);
factor = clamp(factor, 0.0, 1.0);
return lerp(float4(gSkyboxData.fogBlend.xyz, 1), finalColor, factor);
return lerp(float4(pSkyboxData.fogBlend.xyz, 1), finalColor, factor);
}
+6 -6
View File
@@ -9,14 +9,14 @@ struct TextData
float4 textColor;
float scale;
}
ParameterBuffer<SamplerState> glyphSampler;
ParameterBlock<SamplerState> glyphSampler;
//layout(set = 1)
//ShaderBuffer<GlyphData> glyphData;
ParameterBuffer<Texture2D<uint>[]> glyphTextures;
ParameterBuffer<Texture2D<uint>[]> pGlyphTextures;
[[vk::push_constant]]
ConstantBuffer<TextData> textData;
struct VertexStageInput
struct VertexInput
{
float2 position;
float2 widthHeight;
@@ -24,7 +24,7 @@ struct VertexStageInput
uint vertexId : SV_VertexID;
};
struct VertexStageOutput
struct VertexOutput
{
float4 position : SV_Position;
float2 texCoords : TEXCOORD;
@@ -32,7 +32,7 @@ struct VertexStageOutput
};
[shader("vertex")]
VertexStageOutput vertexMain(VertexStageInput input)
VertexOutput vertexMain(VertexInput input)
{
float xpos = input.position.x;
float ypos = input.position.y;
@@ -61,5 +61,5 @@ float4 fragmentMain(
uint glyphIndex : GLYPHINDEX
) : SV_Target
{
return textData.textColor * glyphTextures[glyphIndex].Sample(glyphSampler, texCoords);
return textData.textColor * pGlyphTextures[glyphIndex].Sample(glyphSampler, texCoords);
}
+6 -6
View File
@@ -24,9 +24,9 @@ struct UIParameter
Texture2D<float4> backgroundTextures[];
}
ParameterBuffer<UIParameter> params;
ParameterBlock<UIParameter> pParams;
struct VertexStageOutput
struct VertexOutput
{
float4 position : SV_Position;
float2 texCoords : TEXCOORD;
@@ -34,7 +34,7 @@ struct VertexStageOutput
};
[shader("vertex")]
VertexStageOutput vertexMain(uint vertexId : SV_VertexID, RenderElementStyle style)
VertexOutput vertexMain(uint vertexId : SV_VertexID, RenderElementStyle style)
{
float xMin = style.position.x;
float xMax = xMin + style.dimensions.x;
@@ -46,8 +46,8 @@ VertexStageOutput vertexMain(uint vertexId : SV_VertexID, RenderElementStyle sty
float4(xMax, yMin, 1, 0),
float4(xMax, yMax, 1, 1)
};
VertexStageOutput output;
output.position = mul(viewData.projectionMatrix, float4(coordinates[vertexId].xy, style.position.z, 1));
VertexOutput output;
output.position = mul(pViewData.projectionMatrix, float4(coordinates[vertexId].xy, style.position.z, 1));
output.texCoords = coordinates[vertexId].zw;
output.style = style;
return output;
@@ -64,7 +64,7 @@ float4 fragmentMain(
uint imageIndex = style.backgroundImageIndex;
if(imageIndex < numBackgroundTextures)
{
bgTextureColor = backgroundTextures[imageIndex].Sample(backgroundSampler, texCoords);
bgTextureColor = pParams.backgroundTextures[imageIndex].Sample(pParams.backgroundSampler, texCoords);
}
return float4(style.backgroundColor, style.opacity) * bgTextureColor;
}
+2 -3
View File
@@ -9,15 +9,14 @@ struct ViewParameter
float4 cameraPos_WS;
float2 screenDimensions;
}
layout(set = INDEX_VIEW_PARAMS)
ParameterBlock<ViewParameter> viewParams;
ParameterBlock<ViewParameter> pViewParams;
// Convert screen space coordinates to view space.
float4 screenToClip( float4 screen )
{
// Convert to normalized texture coordinates
float2 texCoord = screen.xy / viewParams.screenDimensions;
float2 texCoord = screen.xy / pViewParams.screenDimensions;
// Convert to clip space
return float4( float2( texCoord.x, 1.0f-texCoord.y ) * 2.0f - 1.0f, screen.z, screen.w );
+5 -5
View File
@@ -1,6 +1,6 @@
import MaterialParameter;
import BRDF;
import Common;
import BRDF;
import MaterialParameter;
interface ILightEnv
{
@@ -15,7 +15,7 @@ struct DirectionalLight : ILightEnv
float3 illuminate<B:IBRDF>(MaterialParameter input, B brdf)
{
float3 lightDir_TS = normalize(direction.xyz);
return brdf.evaluate(input.viewDir_TS, -lightDir_TS, color.xyz);
return brdf.evaluate(input.viewDir_TS, -lightDir_TS, color.xyz);
}
};
@@ -57,7 +57,7 @@ struct PointLight : ILightEnv
}
float3 getViewPos()
{
return mul(viewParams.viewMatrix, position_WS).xyz;
return mul(pViewParams.viewMatrix, position_WS).xyz;
}
};
@@ -69,4 +69,4 @@ struct LightEnv
uint numPointLights;
};
ParameterBlock<LightEnv> gLightEnv;
ParameterBlock<LightEnv> pLightEnv;
+1 -1
View File
@@ -8,4 +8,4 @@ interface IMaterial
BRDF prepare(MaterialParameter input);
};
ParameterBlock<IMaterial> gMaterial;
ParameterBlock<IMaterial> pMaterial;
+1 -14
View File
@@ -1,24 +1,11 @@
import VertexData;
struct MaterialParameter
{
float3 position_TS;
float3 position_TS;
float3 worldPosition;
float2 texCoords;
float3 normal;
float3 tangent;
float3 biTangent;
float3 viewDir_TS;
static MaterialParameter create(VertexAttributes attrib)
{
MaterialParameter result;
result.worldPosition = attrib.getWorldPosition().xyz;
result.texCoords = attrib.getTexCoords();
result.normal = attrib.getNormal();
result.tangent = attrib.getTangent();
result.biTangent = attrib.getBiTangent();
return result;
}
}
+1 -1
View File
@@ -37,5 +37,5 @@ struct Scene
StructuredBuffer<uint32_t> vertexIndices;
};
ParameterBlock<Scene> scene;
ParameterBlock<Scene> pScene;
+19 -26
View File
@@ -1,8 +1,8 @@
import VertexData;
import Common;
import Scene;
import VertexData;
import MaterialParameter;
struct StaticMeshVertexAttributes : VertexAttributes
struct StaticMeshVertexAttributes : IVertexAttributes
{
float4 clipPosition: SV_Position;
float3 worldPosition: POSITION0;
@@ -10,37 +10,30 @@ struct StaticMeshVertexAttributes : VertexAttributes
float3 normal: NORMAL0;
float3 tangent: TANGENT0;
float3 biTangent: BITANGENT0;
float3 getWorldPosition()
MaterialParameter create()
{
return worldPosition;
MaterialParameter result;
result.worldPosition = worldPosition;
result.texCoords = texCoords;
result.normal = normal;
result.tangent = tangent;
result.biTangent = biTangent;
return result;
}
float2 getTexCoords()
{
return texCoords;
}
float3 getNormal()
{
return normal;
}
float3 getTangent()
{
return tangent;
}
float3 getBiTangent()
{
return biTangent;
}
}
struct StaticMeshVertexData : VertexData
};
struct StaticMeshVertexData : IVertexData
{
typedef StaticMeshVertexAttributes VertexAttributes;
StaticMeshVertexAttributes getAttributes(uint index, float4x4 transform)
{
StaticMeshVertexAttributes attr;
float4 localPos = float4(positions[index], 1);
float4 worldPos = mul(transform, localPos);
float4 viewPos = mul(viewParams.viewMatrix, worldPos);
float4 clipPos = mul(viewParams.projectionMatrix, viewPos);
float4 viewPos = mul(pViewParams.viewMatrix, worldPos);
float4 clipPos = mul(pViewParams.projectionMatrix, viewPos);
attr.clipPosition = clipPos;
attr.worldPosition = worldPos.xyz;
attr.texCoords = texCoords[index];
@@ -54,4 +47,4 @@ struct StaticMeshVertexData : VertexData
StructuredBuffer<float3> normals;
StructuredBuffer<float3> tangents;
StructuredBuffer<float3> biTangents;
}
};
+7 -10
View File
@@ -1,16 +1,13 @@
import Scene;
import MaterialParameter;
interface VertexAttributes
interface IVertexAttributes
{
float3 getWorldPosition();
float2 getTexCoords();
float3 getNormal();
float3 getTangent();
float3 getBiTangent();
}
MaterialParameter create();
};
interface VertexData
interface IVertexData
{
associatedtype VertexAttributes : IVertexAttributes;
VertexAttributes getAttributes(uint index, float4x4 transform);
};
ParameterBlock<VertexData> vertexData;
ParameterBlock<IVertexData> pVertexData;