From fbc3526c58060658524147a55f263f3bfa6c4309 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Fri, 21 Aug 2020 13:37:05 +0200 Subject: [PATCH] Added HLSL shaders for order independent transparency sample --- data/shaders/hlsl/oit/color.frag | 64 ++++++++++++++++++++++++ data/shaders/hlsl/oit/color.frag.spv | Bin 0 -> 2748 bytes data/shaders/hlsl/oit/color.vert | 14 ++++++ data/shaders/hlsl/oit/color.vert.spv | Bin 0 -> 656 bytes data/shaders/hlsl/oit/geometry.frag | 56 +++++++++++++++++++++ data/shaders/hlsl/oit/geometry.frag.spv | Bin 0 -> 2080 bytes data/shaders/hlsl/oit/geometry.vert | 34 +++++++++++++ data/shaders/hlsl/oit/geometry.vert.spv | Bin 0 -> 1304 bytes 8 files changed, 168 insertions(+) create mode 100644 data/shaders/hlsl/oit/color.frag create mode 100644 data/shaders/hlsl/oit/color.frag.spv create mode 100644 data/shaders/hlsl/oit/color.vert create mode 100644 data/shaders/hlsl/oit/color.vert.spv create mode 100644 data/shaders/hlsl/oit/geometry.frag create mode 100644 data/shaders/hlsl/oit/geometry.frag.spv create mode 100644 data/shaders/hlsl/oit/geometry.vert create mode 100644 data/shaders/hlsl/oit/geometry.vert.spv diff --git a/data/shaders/hlsl/oit/color.frag b/data/shaders/hlsl/oit/color.frag new file mode 100644 index 00000000..d50c1150 --- /dev/null +++ b/data/shaders/hlsl/oit/color.frag @@ -0,0 +1,64 @@ +// Copyright 2020 Sascha Willems + +#define MAX_FRAGMENT_COUNT 128 + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +struct Node +{ + float4 color; + float depth; + uint next; +}; + +RWTexture2D headIndexImage : register(u0); + +struct Particle +{ + float2 pos; + float2 vel; + float4 gradientPos; +}; + +// Binding 0 : Position storage buffer +RWStructuredBuffer nodes : register(u1); + +float4 main(VSOutput input) : SV_TARGET +{ + Node fragments[MAX_FRAGMENT_COUNT]; + int count = 0; + + uint nodeIdx = headIndexImage[uint2(input.Pos.xy)].r; + + while (nodeIdx != 0xffffffff && count < MAX_FRAGMENT_COUNT) + { + fragments[count] = nodes[nodeIdx]; + nodeIdx = fragments[count].next; + ++count; + } + + // Do the insertion sort + for (uint i = 1; i < count; ++i) + { + Node insert = fragments[i]; + uint j = i; + while (j > 0 && insert.depth > fragments[j - 1].depth) + { + fragments[j] = fragments[j-1]; + --j; + } + fragments[j] = insert; + } + + // Do blending + float4 color = float4(0.025, 0.025, 0.025, 1.0f); + for (uint f = 0; f < count; ++f) + { + color = lerp(color, fragments[f].color, fragments[f].color.a); + } + + return color; +} \ No newline at end of file diff --git a/data/shaders/hlsl/oit/color.frag.spv b/data/shaders/hlsl/oit/color.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..7e2e62e96e0732bfd2463d04e5fd70f5c8d0c893 GIT binary patch literal 2748 zcmZ9M+j3M@5QbMyAg6FX1R+iU5had_fGDR7h(k0$NFsQ~NoI#cNkR=13#+_H`7&PU zh2HuM_&8WkIo$Ic4iuRS&`T3$#zq!(OJNx_7 z3&`MBk-O$r9;|ebVe`c8;$e58Vzbxf;&B&I=Gr7D_oI@ppL1okTmP=rsZZazH`ADE zUYp6W)$`lOX6)5Iwe6_b>`mJqU~T)dehs+KyLLscCf%>!e@c6a--@pW%zZNRZRjrjgUFhM zrC;v3pRpp|e%3(no#^%zd>4A;cmM9^xV^jf(c4~R4Y*f*ANb?RlMBK3!>M+8KmG$~ z#yI~`P9+}#?g_xtt$d`~KSZYXhd$z_1SOeDgEmrFvBIXD-?Z%ncd$y)_ z`LWE+C4V_{_sEZDZeC~l3euU{yZi*wy}@72+?nse`Wn(aCv%LmkdGqm!(8X#&eC`3 zk~<&Yy?N!%$9eQ*?tHAF?JQ?^CdRsI;4j$gNcVc?IpULe^&jbB_YrkdN1$6WIz5SGJ7txK?_b2^dLYl|*4_v=oyS=G5IG6Wz z8F&ZwXD!d~{fz;A4Qlva8o>El+p`})UIAmkrOkW33dVr5jTyb4ZN11z>iX`k0rwlP z{}MN44ej=J4EX_wn*N{In=^Ax`qrrFe4VL%`5#lg1J5gOB0aY<=6)UB{~%+=!H3|7 zoc|+q^ZiPG?_mNMuig3HKpO9IzWQ$h?bcC`x!pqd4DPpo&prvX$INbLn=`ZDDWrLn z(eE_6Im|r+J_f(!{_ddb_doPUY=cN+w0TD7If}ds>_wlmvLEm46QJ++obOX~d(s|n z>@#%h=yL|2BkjTE4D`#j+q-(q;0yGq8#DM4oA!wLD#zHfZ$WNMbspx9_Vsd3eWh=hZjioyosOx<~2EecvrG1dN#lb0F@cjqbel6+mCSmw9yk@m}s{ zKcbwKe&e-UQ{6i{j$8nq%l+Gc^Rkykpszu1-sLx-8g~#L_xWx1Pv&zxfNQH_D_^;J iJ(us!T%OlD#>d<|o4xpss≤@2MZ@zJJMb4*Um*hQ?d~ literal 0 HcmV?d00001 diff --git a/data/shaders/hlsl/oit/color.vert b/data/shaders/hlsl/oit/color.vert new file mode 100644 index 00000000..609b3606 --- /dev/null +++ b/data/shaders/hlsl/oit/color.vert @@ -0,0 +1,14 @@ +// Copyright 2020 Sascha Willems + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +VSOutput main(uint VertexIndex : SV_VertexID) +{ + VSOutput output = (VSOutput)0; + float2 UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/data/shaders/hlsl/oit/color.vert.spv b/data/shaders/hlsl/oit/color.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..0315880916f2d6e093356afe527a5cb363b90c37 GIT binary patch literal 656 zcmY+CyG{c^3`NcEhBtu_lJL$VI-o{Kh(|{oJ^?xk5TAfV&sQPwOEgHFlXxU>+#r1T^%n(%tb^u#(cG2RLRs+?CE+S!_1!_o?gr=Tt&^VLwtnjMDtH`2UfR&pWtF^ z#M%(l5L3F5RaInM>N088hcnLE;Y`6PG5DNY1Vyn&nEE-t$q5q z^`B_PTgf^5S8{{oo&S|O=NjVjMKdDzuD_aXu>2(F-yye7{v)|va(Q?8p4=X}y!*O` lv)?{0uNCfqT+aC>{BPXTA+FXlck8aN*_r$B><9G){tKfp77qXb literal 0 HcmV?d00001 diff --git a/data/shaders/hlsl/oit/geometry.frag b/data/shaders/hlsl/oit/geometry.frag new file mode 100644 index 00000000..296fd37d --- /dev/null +++ b/data/shaders/hlsl/oit/geometry.frag @@ -0,0 +1,56 @@ +// Copyright 2020 Sascha Willems + +#define MAX_FRAGMENT_COUNT 75 + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +struct Node +{ + float4 color; + float depth; + uint next; +}; + +struct ObjectUBO +{ + float4x4 model; + float4 color; +}; + +cbuffer ubo : register(b1) { ObjectUBO objectUBO; } + +struct GeometrySBO +{ + uint count; + uint maxNodeCount; +}; +// Binding 0 : Position storage buffer +RWStructuredBuffer geometrySBO : register(u2); + +RWTexture2D headIndexImage : register(u3); + +RWStructuredBuffer nodes : register(u4); + +[earlydepthstencil] +void main(VSOutput input) +{ + // Increase the node count + uint nodeIdx; + InterlockedAdd(geometrySBO[0].count, 1, nodeIdx); + + // Check LinkedListSBO is full + if (nodeIdx < geometrySBO[0].maxNodeCount) + { + // Exchange new head index and previous head index + uint prevHeadIdx; + InterlockedExchange(headIndexImage[uint2(input.Pos.xy)], nodeIdx, prevHeadIdx); + + // Store node data + nodes[nodeIdx].color = objectUBO.color; + nodes[nodeIdx].depth = input.Pos.z; + nodes[nodeIdx].next = prevHeadIdx; + } +} \ No newline at end of file diff --git a/data/shaders/hlsl/oit/geometry.frag.spv b/data/shaders/hlsl/oit/geometry.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..3fd22787f3fca4d56895ba8e37c572c85d032a96 GIT binary patch literal 2080 zcmZvb*-leY6owB&>ntFn1GNQb6z35&f)~h*M2Ybl=m9mhCACf9t$ZnOd;y2V#P2&j z%N&TiSzUYm|C;vN`waBY9!iqFBuP#t3;erAlKvbS$ZXl6q?`<*-8a@hHYNIz;bb7g zNb+xgg#7@&5_$ut5lImh&EwCd?+ zbYS+g+4|gSqpf01OO%ph_~bR;zF+IKyPKVEJFPEux3<#u{BqiAq@DKO8da@n|3%FF zVy?|rx7k6LLBx79*nLeaFLNr(aTsoUU*2-!EV6Uosn36GtZ%2-B{CgFe@NHsE6sYk zyV4^{pvS`hKRsIzn)t!wI67>5)po@!0<+h8y3_f94$OONrn?>~%XLDV++T9Lc*o1s z(%-&@5N&5XgSf)3u{TcJITU$qdGpA7_9Cw>?;DY~pCYd<@4I-FbX037j%~eHQbGbdzGc*1a`zm5>dF@fe75>&P^5X~W z32ghEpz0*LicFGgD$~6?n8H4dE#}-R{Hp`25Npq3RsPSQ%_*jD+^y%C26g6Q#yJmd zm3-mDkjgR#?K<`UDcpsi*6D9m|u zjhHIhy*@RxG3Fj)H-mOw-l6l8)4qV#N87lIXzPe+UqZ`SOZ#$en_~gn8T!5IqwQ>b zqhWh)zdx6}XYqRr-m|#xLmrUH{@uH($WPcS=x4;*!&OB8MQ)~szJ^%O_vD*Xe}}XG zIYi#KC8v(K>+FkhzBg+acLS0CNpMdv(7`edl}|v0ugI zxf;Yc^E-(AQ(loXzl%60aeMuipWz;Rxj2J;EE40r+((?fXO8}z(E~)zv+DN{apw9N zuYS%s#Pxkc7Vq;BQk<`M{TM06TE|#%{bQa_4*2=K>L>0QeleSvk@^qQc!c}~vJ8W` literal 0 HcmV?d00001 diff --git a/data/shaders/hlsl/oit/geometry.vert b/data/shaders/hlsl/oit/geometry.vert new file mode 100644 index 00000000..f4b5c940 --- /dev/null +++ b/data/shaders/hlsl/oit/geometry.vert @@ -0,0 +1,34 @@ +// Copyright 2020 Sascha Willems + +struct VSInput +{ +[[vk::location(0)]] float4 Pos : POSITION0; +}; + +struct RenderPassUBO +{ + float4x4 projection; + float4x4 view; +}; + +cbuffer renderPassUBO : register(b0) { RenderPassUBO renderPassUBO; } + +struct ObjectUBO +{ + float4x4 model; + float4 color; +}; + +cbuffer objectUBO : register(b1) { ObjectUBO objectUBO; } + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +VSOutput main(VSInput input) +{ + VSOutput output = (VSOutput)0; + output.Pos = mul(renderPassUBO.projection, mul(renderPassUBO.view, mul(objectUBO.model, input.Pos))); + return output; +} diff --git a/data/shaders/hlsl/oit/geometry.vert.spv b/data/shaders/hlsl/oit/geometry.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..9ff7f93aaaa514af553d188fced6a858401c5a82 GIT binary patch literal 1304 zcmZvbT~8BH5QYye6h#FQ`S7c5<};>QmtuoorJB@4m$FZ{XQnD9K? zow#j0WI8kNyl3V;)6#BjFQzn?Qd&;$`1Gu%R*kf)-0Dh##xcGcj>g6q3 z?ne1f>-Om2|JPgfm8Rm<9+UX&=JAGu4WA2{2RW`|eV|-WE&3lcy^P6>Z z>*_qJ6cTW@CvFOJA5XC(`nq3_-)G#jhxb0uV6*q+#XY?z<{k1vG2dn1*lX0AShH{N zqHpZJsVBbA=;bUiXKfHK;WKO#1@73~e(QWb#%Gw?-`DvQVo&7D#MZZ{ui)+B{Vt#G zOHAw5ZxqX@xl=U+SM70Mt{TPUuHxm2nLooj(^=+g_;#JI!F*2K16ju#%h|x&!xe|A*zt0qBzrdX5{xo@Nd5KvI z-YeqZx!d5qCbky5H^l0l?dSi6wclt|$6HJ-;(=wv;`R)zN1S2m`NZygr`TU!xrf~Y DwHi^W literal 0 HcmV?d00001