Refactored and reorganized the codebase to improve readability, performance, and maintainability. Introduced new interfaces and structs for better resource management, updated project configuration files, and refactored shader and graphics pipeline management. Improved error handling, code formatting, and removed unused code and namespaces. Updated DLL references and method signatures for consistency and maintainability.
89 lines
2.7 KiB
HLSL
89 lines
2.7 KiB
HLSL
cbuffer ConstantBuffer : register(b0)
|
||
{
|
||
float4 _Color;
|
||
uint _TextureIndex1;
|
||
uint _TextureIndex2;
|
||
uint _TextureIndex3;
|
||
uint _TextureIndex4;
|
||
uint _VertexBufferIndex;
|
||
uint _IndexBufferIndex;
|
||
};
|
||
|
||
// SM 6.6 approach - direct access to global descriptor heap
|
||
SamplerState _MainSampler : register(s0);
|
||
|
||
struct Vertex
|
||
{
|
||
float4 position;
|
||
float4 normal;
|
||
float4 tangent;
|
||
float4 color;
|
||
float4 uv;
|
||
};
|
||
|
||
struct PixelInput
|
||
{
|
||
float4 position : SV_POSITION;
|
||
float4 color : COLOR;
|
||
float4 uv : TEXCOORD0;
|
||
};
|
||
|
||
[NumThreads(3, 1, 1)] // 3 threads per triangle
|
||
[OutputTopology("triangle")]
|
||
void MSMain(
|
||
uint3 groupThreadID : SV_GroupThreadID,
|
||
uint groupID : SV_GroupID,
|
||
out vertices PixelInput outVerts[3],
|
||
out indices uint3 outTris[1])
|
||
{
|
||
// Fetch bindless buffers
|
||
ByteAddressBuffer vertexBuffer = ResourceDescriptorHeap[_VertexBufferIndex];
|
||
ByteAddressBuffer indexBuffer = ResourceDescriptorHeap[_IndexBufferIndex];
|
||
|
||
// Compute the triangle’s vertex indices
|
||
uint vertexId = groupThreadID.x;
|
||
uint indexOffset = (groupID.x * 3 + vertexId) * 4; // uint32 index
|
||
uint vertexIndex = indexBuffer.Load(indexOffset);
|
||
|
||
// Load vertex attributes
|
||
uint vertexOffset = vertexIndex * 80; // 80 bytes per vertex
|
||
Vertex v;
|
||
v.position = asfloat(vertexBuffer.Load4(vertexOffset + 0));
|
||
v.normal = asfloat(vertexBuffer.Load4(vertexOffset + 16));
|
||
v.tangent = asfloat(vertexBuffer.Load4(vertexOffset + 32));
|
||
v.color = asfloat(vertexBuffer.Load4(vertexOffset + 48));
|
||
v.uv = asfloat(vertexBuffer.Load4(vertexOffset + 64));
|
||
|
||
// Write vertex output
|
||
outVerts[vertexId].position = v.position;
|
||
outVerts[vertexId].color = v.color;
|
||
outVerts[vertexId].uv = v.uv;
|
||
|
||
// Thread 0 defines topology
|
||
if (vertexId == 0)
|
||
{
|
||
SetMeshOutputCounts(3, 1);
|
||
outTris[0] = uint3(0, 1, 2);
|
||
}
|
||
}
|
||
|
||
float4 PSMain(PixelInput input) : SV_TARGET
|
||
{
|
||
// SM 6.6 Modern Bindless Approach:
|
||
// ResourceDescriptorHeap[index] directly accesses any texture in the heap
|
||
Texture2D tex1 = ResourceDescriptorHeap[_TextureIndex1];
|
||
Texture2D tex2 = ResourceDescriptorHeap[_TextureIndex2];
|
||
Texture2D tex3 = ResourceDescriptorHeap[_TextureIndex3];
|
||
Texture2D tex4 = ResourceDescriptorHeap[_TextureIndex4];
|
||
|
||
// Sample the textures
|
||
float4 color1 = tex1.Sample(_MainSampler, input.uv.xy);
|
||
float4 color2 = tex2.Sample(_MainSampler, input.uv.xy);
|
||
float4 color3 = tex3.Sample(_MainSampler, input.uv.xy);
|
||
float4 color4 = tex4.Sample(_MainSampler, input.uv.xy);
|
||
|
||
// Blend all textures together (simple average)
|
||
float4 blendedColor = (color1 + color2 + color3 + color4) * 0.25f;
|
||
|
||
return blendedColor * _Color;
|
||
} |