From 9d367a359ab9989e993cebdef888fc5872ab5218 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Thu, 10 Nov 2022 16:59:26 +0800 Subject: [PATCH] Text Rendering WIP --- Assets/Shaders/Text_FS.glsl | 42 +++++++---- Assets/Shaders/Text_FS.shshaderb | Bin 0 -> 3069 bytes Assets/Shaders/Text_FS.shshaderb.shmeta | 3 + Assets/Shaders/Text_VS.glsl | 68 ++++++++++++++++-- Assets/Shaders/Text_VS.shshaderb | Bin 0 -> 4641 bytes Assets/Shaders/Text_VS.shshaderb.shmeta | 3 + .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 6 +- .../MiddleEnd/Interface/SHGraphicsSystem.h | 2 + .../SHTextRenderingSubSystem.cpp | 15 +++- .../TextRendering/SHTextRenderingSubSystem.h | 5 +- 10 files changed, 121 insertions(+), 23 deletions(-) create mode 100644 Assets/Shaders/Text_FS.shshaderb create mode 100644 Assets/Shaders/Text_FS.shshaderb.shmeta create mode 100644 Assets/Shaders/Text_VS.shshaderb create mode 100644 Assets/Shaders/Text_VS.shshaderb.shmeta diff --git a/Assets/Shaders/Text_FS.glsl b/Assets/Shaders/Text_FS.glsl index d6f88687..f3884973 100644 --- a/Assets/Shaders/Text_FS.glsl +++ b/Assets/Shaders/Text_FS.glsl @@ -22,29 +22,43 @@ layout(location = 0) in struct // material stuff layout(location = 3) flat in struct { - int materialIndex; uint eid; - uint lightLayerIndex; } In2; -layout (set = 0, binding = 1) uniform sampler2D textures[]; // for textures (global) -layout (std430, set = 3, binding = 0) buffer MaterialProperties // For materials +// push constants +layout(std140, push_constant) uniform TestPushConstant { - MatPropData data[]; -} MatProp; + vec3 textColor; -layout(location = 0) out vec4 position; +} testPushConstant; + +layout(set = 6, binding = 0) uniform sampler2D fontBitmap; + +layout(location = 0) out vec4 color; layout(location = 1) out uint outEntityID; -layout(location = 2) out uint lightLayerIndices; -layout(location = 3) out vec4 normals; -layout(location = 4) out vec4 albedo; + +float median(float r, float g, float b) +{ + return max(min(r, g), min(max(r, g), b)); +} void main() { - position = In.vertPos; - normals = In.normal; - albedo = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv) * MatProp.data[In2.materialIndex].color; + vec3 msd = texture (fontBitmap, In.uv).rgb; + float sd = median (msd.r, msd.g, msd.b); + float screenPxDistance = 2 * (sd - 0.5f); + float opacity = clamp (screenPxDistance + 0.5f, 0.0f, 2.0f); + vec4 fragColor = vec4 (1.0f); + + if (opacity > 0.02f && opacity < 1.9f) + { + fragColor = vec4(0.0f, 1.0f, 1.0f, 1.0f); + } + + fragColor = mix(vec4(0.0f), vec4(testPushConstant.textColor, 1.0f), min (opacity, 1.0f)); + + + color = fragColor; outEntityID = In2.eid; - lightLayerIndices = In2.lightLayerIndex; } \ No newline at end of file diff --git a/Assets/Shaders/Text_FS.shshaderb b/Assets/Shaders/Text_FS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..9121f960ec523abe516f45f4ea3a6afdebb3ae58 GIT binary patch literal 3069 zcmZXVYjYGu6oxy=ZtjF27Yot2D`+wb^s;B|NXYS8goj~)k=xceeUp)jg@4L_>){CeQc&t7c% zl_$zGOrDK0lz3@tt5n|bD($w{jh{CHuMtLpR}DL= z6z&DoO7d7<7*!g*YL<`}BfHPMb~LWNG=pmBN7J=Si|L;rlh-~+q&wCgm8K`)wEmH` zPf0hsRpEK_y6jpjidVz9>9{(#htwubmHw+S6D8=IEUWee;oQ7sRe!`&B1wW z>SU;WLAJ`t&Y2n6w4F1;pF7|$yx_-)KEuFh6-O_1<@pI+M zn-AsJI(~hv)o7(X7&3Q-?F8L;yVu=aYegi81!*6HNenv^@b679^tnBB{ zC-<$@i#MWJtJqxEDhA9Gl4{T^X9pqu9!T!yW;AO`iqZQw5}w)ji%irYP7kLN&uDM? z{q?#tDJdWOqxbMxo8#m27VtSMxb%D?v2%${j8}D38OTwThmUnD4dQqSlW9B?!_-<0l?5F;l(y#_lj|1If)_0L)Vto4~cZEbSGe^{6 z@UQ6Ja5mg22KoLFl9y&Kcbab~_Z}a8;egL~E*s}Nm-QD8_%28U12Qhz9^y(oWN zLS1qZhsRkEb2)Cv2K!d~V9m=CFy7dA7F&_c8(fx-$(X@t>6Yrt~Kgu(HH)wq(Qk(Q znM>?<)!C6|{H3!Zc1HrnUB-56;hp~}%*D{0$ph&xB=;q}Q`W+r`BDOYOC0w7mBpm? zG0$T3!|@(ktY3OtH>xP@OPCM;p=49y_WVdTdma~;Iu!}|xaY*+x;$0c#IwS=P$Q5q zk9)#*i<cIc#o_bq!T(#;u1ffhux{=sV_32v z9&c$RV~=L+G1;8YA!*l#3EA+Se^@qiTwf+-vp@O*m$>5|k)56UlKkx4qw<+MErCni g%{?ZY^|(66WxG1eBkp1+Y>Ygt2kt-G2ROa>7e~(gwEzGB literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Text_FS.shshaderb.shmeta b/Assets/Shaders/Text_FS.shshaderb.shmeta new file mode 100644 index 00000000..af5a44b7 --- /dev/null +++ b/Assets/Shaders/Text_FS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Text_FS +ID: 38024754 +Type: 2 diff --git a/Assets/Shaders/Text_VS.glsl b/Assets/Shaders/Text_VS.glsl index bfc220d4..369e185e 100644 --- a/Assets/Shaders/Text_VS.glsl +++ b/Assets/Shaders/Text_VS.glsl @@ -4,10 +4,12 @@ //#include "ShaderDescriptorDefinitions.glsl" +// vertex inputs layout(location = 0) in vec4 positionalOffset; -layout(location = 1) in unsigned int glyphIndex; - +layout(location = 1) in uint glyphIndex; +layout(location = 2) in uvec2 integerData; +// between shader stages layout(location = 0) out struct { vec4 vertPos; // location 0 @@ -22,6 +24,7 @@ layout(location = 3) out struct uint eid; } Out2; +// Camera data layout(set = 2, binding = 0) uniform CameraData { vec4 position; @@ -30,10 +33,65 @@ layout(set = 2, binding = 0) uniform CameraData mat4 projMat; } cameraData; +// push constants +layout(std140, push_constant) uniform TestPushConstant +{ + mat4 worldTransform; + +} testPushConstant; + +// Descriptor sets +layout(std430, set = 6, binding = 1) buffer GlyphTransforms +{ + mat4 matrices[]; +} glyphTransforms; + +vec2 CreateQuad(in uint vertexID) +{ + uint b = 1 << vertexID; + return vec2 ((0x3 & b) != 0, (0x9 & b) != 0); +} + void main() { + // write EID data to FS Out2.eid = integerData[0]; - - // clip space for rendering - gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); + + // local variable for font index + uint fontIndex = glyphIndex; + + // get font data + mat4 fontData = glyphTransforms.matrices[fontIndex]; + + // Generate UV coords and vertex positions + Out.uv = CreateQuad(gl_VertexIndex); + vec3 vertexPos = vec3(Out.uv, 1.0f); + + // Get the local matrices + mat4 localModel = testPushConstant.worldTransform; + + //mat4 uiScale = mat4(1.0f); + //uiScale[0][0] = cameraData.cameraRight / 20.49f; + //uiScale[1][1] = cameraData.cameraTop / 11.323f; + + // transform the UV to atlas space to sample the font bitmap correctly + Out.uv = vec2(mat3(fontData) * vec3(Out.uv, 1.0f)); + + // Matrix to transform the quad from local to font space (for a font to be of correct size) + mat3 toFontSpace = mat3(1.0f); + toFontSpace[0][0] = fontData[3][0]; + toFontSpace[1][1] = fontData[3][1]; + toFontSpace[2][0] = positionalOffset.x; + toFontSpace[2][1] = positionalOffset.y; + + mat4 PVMatrix = cameraData.vpMat; + + // Initialize variables for use in FS + //characterIndex = gl_InstanceID; + + // Transform the vertices to font space + vertexPos = toFontSpace * vertexPos; + + // transform the vertex position to font space + gl_Position = PVMatrix * localModel * vec4(vertexPos, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/Text_VS.shshaderb b/Assets/Shaders/Text_VS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..c74dddbe642b35cc9d3a62c6643e46fbbf25cd07 GIT binary patch literal 4641 zcmZveX_FL15QdvQQBY7&@BjfrK~WShR6Kx126S-;LA+hZnO+zjX2zM`1r!l46mRf8 zzZ?Dw!wCP9Uo?E4?#^W-tc`av^UbWxtm>-nU9j@r~BFQRyy5kw$tfGvzOMh=3Hvr!hyJEyWW~@3nBc9tGWdpm1cE$24F&2-w?o^~TWR>nEuQ0sX2a7o(7mNG7%n8%GJ z_aQ6B9q85C{h3bhNS{6m9vAzY^_umxukIRIQjvEc-t}xVfH6kYwp=ULT8E)e<4@zO9^C7W`j}uwlMj#+wIgY-Ry-B=Ud|DD z)ZJHk_i(ODjsebnoNJ~>Wh2hp((QF#k+aSj?D{|*pXC>D>~S^i72AvnTkz`o%B8@L z=keChc@E+J=Ih*)Vh_z_ANVF(&F;>oJ6uoa=h=_G*;Z@b=ehBIIx6K^UyW|8wr5@2 zyxN{=ZF|tZ7dZyDf!)}iWydJk&2QM(=j?yEak!}{jKjW-3 zI8WPoRS@&!E}SgENPm z^@3BE^Sx|s^BK2{U*%djW7Mx8%4fU=IM!g>w~)V*$b~tdBrEV;gsxrW@hg(#obl#b zf?NaaabsyO9k9*099Un!_6p!wPS%x3d23uP$q4(J+&cAe%v*(RKdZ@h1F~4hNOB{( z`Q^5fOM89EIoBRH0EcV33F%zdz?Tsa;|CUmZdbeR)PuqC?-cfUy|1PBK z@p-J|_im(|w)yTsx_|Pk$mD%icU|5|ZR74o+M}Fxw7r+n_k*Qg%q_k@)^U%N=Gcz3 z*KNQY+B<-p{t4s);2!DM_HN7R--9&PoUZLLq-%@$ljyER-u@3D?Z>%KBAq8^Zf(CS za{8Ytb>rQq=aA-!+i=m9^OON^o%-;`3uJPo^#!Y%|NN` z8TS9Gu$7eo+jHUnDB(BW|4+j9+4_G(*!oYG_I9dzr)~usf$xh4sp);&1mumm4S73Q z4>o{@=vv#Dh`$rvyQ$CqwZr!Sy4-d$dzT&pTY{VHxcjt**H>S8l*7F(3ThIIWH1LkP2eJNVO5S*%p?3J5MR!l^#dGvLkaJAYopoOT z^1@+Hp0$|sBD!vdoj1MvB!1v3-`DI zCm(y9qRTmgn?aYex7g!D=*H^veRGz5aSsjy>+6sC&5}pVbFY+Kk+V2AufiFtFM4jF zN6$VNZR6D2$R6-qXUJLLGwOpCz-Q;VnFIPF?kKu*efGwgOU}56IgY*sn9KK1N+hHi|!^YzI^?k~~J z8TMD`-mi1?<9p|8V2pg!_y*lPafZG{mvaR79lD%nD7f!SZU|ZBt?OO=0XW}y{c&FP z{RpgYjQjHw@@H@kcs^W@wsC(`>0aPB#P`!;;J6rUA#NPG2>3m@1R39xOVRbYwlU;o zz_>rijzlmB_1ryl3fGqPz#!0(sYe qHHdtx(FgNghrJ5ON4_=a@`L%-V#`OqYPm1#;H;(pANE4qeft->L6Lv} literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Text_VS.shshaderb.shmeta b/Assets/Shaders/Text_VS.shshaderb.shmeta new file mode 100644 index 00000000..17df2e98 --- /dev/null +++ b/Assets/Shaders/Text_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Text_VS +ID: 39816727 +Type: 2 diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 26befb28..f7656e66 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -116,6 +116,9 @@ namespace SHADE // Create generic command buffer graphicsCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true); + SHAssetManager::CompileAsset("../../Assets/Shaders/Text_VS.glsl"); + SHAssetManager::CompileAsset("../../Assets/Shaders/Text_FS.glsl"); + // Load Built In Shaders static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet(FS_DEFAULT); @@ -123,7 +126,8 @@ namespace SHADE static constexpr AssetID FS_DEBUG = 36671027; debugFragShader = SHResourceManager::LoadOrGet(FS_DEBUG); static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet(CS_COMPOSITE); static constexpr AssetID SSAO = 38430899; ssaoShader = SHResourceManager::LoadOrGet(SSAO); - static constexpr AssetID SSAO_BLUR = 39760835; ssaoBlurShader = SHResourceManager::LoadOrGet(SSAO_BLUR); + static constexpr AssetID TEXT_VS = 39816727; textVS = SHResourceManager::LoadOrGet(TEXT_VS); + static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); } void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index a5a5ada0..a550ea22 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -412,6 +412,8 @@ namespace SHADE Handle deferredCompositeShader; Handle ssaoShader; Handle ssaoBlurShader; + Handle textVS; + Handle textFS; // Built-In Materials diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp index 0db0b785..1e1551d5 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp @@ -6,6 +6,7 @@ #include "Graphics/Devices/SHVkLogicalDevice.h" #include "Graphics/MiddleEnd/TextRendering/SHFont.h" #include "Graphics/Buffers/SHVkBuffer.h" +#include "Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.h" namespace SHADE { @@ -86,11 +87,21 @@ namespace SHADE } - void SHTextRenderingSubSystem::Init(Handle device, Handle descPool) noexcept + void SHTextRenderingSubSystem::Init(Handle device, Handle compatibleRenderpass, Handle subpass, Handle descPool, Handle textVS, Handle textFS) noexcept { logicalDevice = device; - + // prepare pipeline layout params + SHPipelineLayoutParams plParams + { + .shaderModules = {textVS, textFS}, + .globalDescSetLayouts = SHGraphicsGlobalData::GetDescSetLayouts() + }; + + pipelineLayout = logicalDevice->CreatePipelineLayout(plParams); + + // Create pipeline + pipeline = logicalDevice->CreateGraphicsPipeline(pipelineLayout, nullptr, compatibleRenderpass, subpass); } void SHTextRenderingSubSystem::Run(uint32_t frameIndex) noexcept diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.h index 271d3b99..26db3046 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.h @@ -14,6 +14,9 @@ namespace SHADE class SHTextRendererComponent; class SHVkPipeline; class SHVkPipelineLayout; + class SHVkRenderpass; + class SHSubpass; + class SHVkShaderModule; class SHTextRenderingSubSystem { @@ -32,7 +35,7 @@ namespace SHADE void RecomputePositions(SHTextRendererComponent& textComp) noexcept; public: - void Init(Handle device, Handle descPool) noexcept; + void Init(Handle device, Handle compatibleRenderpass, Handle subpass, Handle descPool, Handle textVS, Handle textFS) noexcept; void Run(uint32_t frameIndex) noexcept; void Render (void) noexcept; void Exit(void) noexcept;