Files
Cielonos/Assets/PotaToon/Shaders/OIT/LinkedListCreation.hlsl
SoulliesOfficial f7af60351b 阶段性完成
2025-12-08 05:27:53 -05:00

48 lines
1.4 KiB
HLSL

/*
* This file includes modifications to original work licensed under the Apache License, Version 2.0.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Modified by: mseon
* Date: 2025-04-06
* Changes:
* 1. Change to use _ScreenSize
*/
#ifndef OIT_LINKED_LIST_INCLUDED
#define OIT_LINKED_LIST_INCLUDED
#include "./OitUtils.hlsl"
struct FragmentAndLinkBuffer_STRUCT
{
uint pixelColor;
uint uDepthSampleIdx;
uint next;
};
float Linear01Depth_(float depth)
{
return 1.0 / (_ZBufferParams.x * depth + _ZBufferParams.y);
}
RWStructuredBuffer<FragmentAndLinkBuffer_STRUCT> FLBuffer;
RWByteAddressBuffer StartOffsetBuffer;
void createFragmentEntry(float4 col, float3 pos, uint uSampleIdx) {
//Retrieve current Pixel count and increase counter
uint uPixelCount = FLBuffer.IncrementCounter();
//calculate bufferAddress
uint uStartOffsetAddress = 4 * (_ScreenSize.x * (pos.y - 0.5) + (pos.x - 0.5));
uint uOldStartOffset;
StartOffsetBuffer.InterlockedExchange(uStartOffsetAddress, uPixelCount, uOldStartOffset);
//add new Fragment Entry in FragmentAndLinkBuffer
FragmentAndLinkBuffer_STRUCT Element;
Element.pixelColor = PackRGBA(col);
Element.uDepthSampleIdx = PackDepthSampleIdx(Linear01Depth_(pos.z), uSampleIdx);
Element.next = uOldStartOffset;
FLBuffer[uPixelCount] = Element;
}
#endif // OIT_LINKED_LIST_INCLUDED