From e116015d8aace197606497244504600811641f3b Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 1 Aug 2019 15:37:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E7=9A=84=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E6=95=B0shader=E4=BB=A5=E5=8F=8Ahq=E7=BA=B9=E7=90=86?= =?UTF-8?q?=E8=BF=87=E6=BB=A4shader(=E5=AE=9E=E8=B4=A8=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E6=9B=B4=E7=83=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/CMakeLists.txt | 19 +-- example/Vulkan/Geometry2D.cpp | 4 +- example/Vulkan/HQFilterTexture.cpp | 236 +++++++++++++++++++++++++++++ example/Vulkan/texture_rect.cpp | 2 +- res/image/Gear.tga | Bin 0 -> 49691 bytes res/image/Yong.tga | Bin 0 -> 49691 bytes res/image/flat_normal.tga | Bin 0 -> 66 bytes res/shader/FlatTexture.frag | 4 +- res/shader/Texture2D.vert | 16 ++ res/shader/drand48.frag | 16 ++ res/shader/hqfilter.frag | 34 +++++ res/shader/shader_compile.sh | 5 + 12 files changed, 322 insertions(+), 14 deletions(-) create mode 100644 example/Vulkan/HQFilterTexture.cpp create mode 100644 res/image/Gear.tga create mode 100644 res/image/Yong.tga create mode 100644 res/image/flat_normal.tga create mode 100644 res/shader/Texture2D.vert create mode 100644 res/shader/drand48.frag create mode 100644 res/shader/hqfilter.frag diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index f624d6c8..83710007 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -10,17 +10,18 @@ endmacro() CreateProject(00.triangle main.cpp) CreateProject(01.indices_rect indices_rect.cpp) CreateProject(02.texture_rect texture_rect.cpp TGATexture.cpp) -CreateProject(03.Geometry2D Geometry2D.cpp) -CreateProject(04.Geometry3D Geometry3D.cpp) -CreateProject(05.SceneTree SceneTree.cpp) +CreateProject(03.HQFilterTexture HQFilterTexture.cpp TGATexture.cpp) +CreateProject(04.Geometry2D Geometry2D.cpp) +CreateProject(05.Geometry3D Geometry3D.cpp) +CreateProject(06.SceneTree SceneTree.cpp) -CreateProject(06.LoadModel LoadModel.cpp TGATexture.cpp AssimpLoaderMesh.h AssimpLoaderMesh.cpp ViewModelFramework.h) -target_link_libraries(06.LoadModel assimp) +CreateProject(07.LoadModel LoadModel.cpp TGATexture.cpp AssimpLoaderMesh.h AssimpLoaderMesh.cpp ViewModelFramework.h) +target_link_libraries(07.LoadModel assimp) -CreateProject(07.InlineGeometryScene InlineGeometryScene.cpp) +CreateProject(08.InlineGeometryScene InlineGeometryScene.cpp) -CreateProject(08.Atomsphere Atomsphere.cpp) +CreateProject(09.Atomsphere Atomsphere.cpp) -CreateProject(09.Deferred Deferred.cpp TGATexture.cpp) +CreateProject(10.Deferred Deferred.cpp TGATexture.cpp) -CreateProject(10.TextureFormat TextureFormat.cpp TGATexture.cpp) \ No newline at end of file +CreateProject(11.TextureFormat TextureFormat.cpp TGATexture.cpp) \ No newline at end of file diff --git a/example/Vulkan/Geometry2D.cpp b/example/Vulkan/Geometry2D.cpp index 597d6841..22552300 100644 --- a/example/Vulkan/Geometry2D.cpp +++ b/example/Vulkan/Geometry2D.cpp @@ -48,7 +48,7 @@ private: bool InitMaterial() { material=shader_manage->CreateMaterial(OS_TEXT("res/shader/OnlyPosition.vert.spv"), - OS_TEXT("res/shader/FlatColor.frag.spv")); + OS_TEXT("res/shader/drand48.frag.spv")); if(!material) return(false); @@ -161,7 +161,7 @@ public: return(true); } - void Resize(int w,int h) + void Resize(int w,int h) override { BuildCommandBuffer(&render_list); } diff --git a/example/Vulkan/HQFilterTexture.cpp b/example/Vulkan/HQFilterTexture.cpp new file mode 100644 index 00000000..35863340 --- /dev/null +++ b/example/Vulkan/HQFilterTexture.cpp @@ -0,0 +1,236 @@ +// 3.HQFilterTexture +// 测试高质量纹理过滤函数 + +#include"VulkanAppFramework.h" +#include +#include +#include + +using namespace hgl; +using namespace hgl::graph; + +VK_NAMESPACE_BEGIN +Texture2D *LoadTGATexture(const OSString &filename,Device *device); +VK_NAMESPACE_END + +constexpr uint32_t SCREEN_WIDTH=512; +constexpr uint32_t SCREEN_HEIGHT=512; + +constexpr uint32_t VERTEX_COUNT=4; + +constexpr float vertex_data[VERTEX_COUNT][2]= +{ + {0,0}, + {1,0}, + {0,1}, + {1,1} +}; + +constexpr float tex_coord_data[VERTEX_COUNT][2]= +{ + {0,0}, + {1,0}, + {0,1}, + {1,1} +}; + +constexpr uint32_t INDEX_COUNT=6; + +constexpr uint16 index_data[INDEX_COUNT]= +{ + 0,1,3, + 0,3,2 +}; + +class TestApp:public VulkanApplicationFramework +{ +private: + + struct MPD + { + vulkan::Material * material =nullptr; + vulkan::Pipeline * pipeline =nullptr; + vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::Renderable * render_obj =nullptr; + + public: + + ~MPD() + { + delete material; + delete render_obj; + delete descriptor_sets; + delete pipeline; + } + }nearest,linear,nearest_hq,linear_hq; + + vulkan::Texture2D * texture =nullptr; + + vulkan::Sampler * sampler_linear =nullptr; + vulkan::Sampler * sampler_nearest =nullptr; + + vulkan::VertexBuffer * vertex_buffer =nullptr; + vulkan::VertexBuffer * tex_coord_buffer =nullptr; + vulkan::IndexBuffer * index_buffer =nullptr; + + SceneNode render_root; + RenderList render_list; +public: + + ~TestApp() + { + SAFE_CLEAR(index_buffer); + SAFE_CLEAR(tex_coord_buffer); + SAFE_CLEAR(vertex_buffer); + SAFE_CLEAR(sampler_nearest); + SAFE_CLEAR(sampler_linear); + SAFE_CLEAR(texture); + } + +private: + + bool InitVBO() + { + vertex_buffer =device->CreateVBO(FMT_RG32F,VERTEX_COUNT,vertex_data); + if(!vertex_buffer)return(false); + + tex_coord_buffer=device->CreateVBO(FMT_RG32F,VERTEX_COUNT,tex_coord_data); + if(!tex_coord_buffer)return(false); + + index_buffer =device->CreateIBO16(INDEX_COUNT,index_data); + if(!index_buffer)return(false); + + return(true); + } + + vulkan::Sampler *InitSampler(VkFilter filter) + { + VkSamplerCreateInfo sampler_create_info; + + sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + sampler_create_info.pNext = nullptr; + sampler_create_info.flags = 0; + sampler_create_info.magFilter = filter; + sampler_create_info.minFilter = filter; + sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.mipLodBias = 0.0f; + sampler_create_info.anisotropyEnable = false; + sampler_create_info.maxAnisotropy = 0; + sampler_create_info.compareEnable = false; + sampler_create_info.compareOp = VK_COMPARE_OP_NEVER; + sampler_create_info.minLod = 0.0f; + sampler_create_info.maxLod = 1.0f; + sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; + sampler_create_info.unnormalizedCoordinates = false; + + return device->CreateSampler(&sampler_create_info); + } + + bool InitTexture() + { + texture=vulkan::LoadTGATexture(OS_TEXT("res/image/Gear.tga"),device); + return texture; + } + + bool InitMaterial(struct MPD *mpd,vulkan::Sampler *sampler,const OSString &fragment_shader) + { + mpd->material=shader_manage->CreateMaterial(OS_TEXT("res/shader/Texture2D.vert.spv"), + OS_TEXT("res/shader/")+fragment_shader+OS_TEXT(".frag.spv")); + if(!mpd->material) + return(false); + + mpd->descriptor_sets=mpd->material->CreateDescriptorSets(); + + mpd->descriptor_sets->BindSampler(mpd->material->GetSampler("tex"),texture,sampler); + mpd->descriptor_sets->Update(); + + mpd->render_obj=mpd->material->CreateRenderable(VERTEX_COUNT); + mpd->render_obj->Set("Vertex",vertex_buffer); + mpd->render_obj->Set("TexCoord",tex_coord_buffer); + mpd->render_obj->Set(index_buffer); + + AutoDelete + pipeline_creater=new vulkan::PipelineCreater(device,mpd->material,sc_render_target); + pipeline_creater->CloseCullFace(); + pipeline_creater->Set(PRIM_TRIANGLES); + + mpd->pipeline=pipeline_creater->Create(); + + return mpd->pipeline; + } + + bool Add(struct MPD *mpd,const Matrix4f &offset) + { + RenderableInstance *ri=db->CreateRenderableInstance(mpd->pipeline,mpd->descriptor_sets,mpd->render_obj); + + if(!ri)return(false); + + render_root.Add(ri,offset); + + return(true); + } + + bool InitScene() + { + Add(&nearest, translate(-1,-1,0)); + Add(&linear, translate( 0,-1,0)); + Add(&nearest_hq,translate(-1, 0,0)); + Add(&linear_hq, translate( 0, 0,0)); + + render_root.RefreshMatrix(); + render_root.ExpendToList(&render_list); + BuildCommandBuffer(&render_list); + return(true); + } +public: + + bool Init() + { + if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) + return(false); + + if(!InitVBO()) + return(false); + + sampler_nearest=InitSampler(VK_FILTER_NEAREST); + sampler_linear=InitSampler(VK_FILTER_LINEAR); + + if(!InitTexture()) + return(false); + + if(!InitMaterial(&nearest, sampler_nearest ,OS_TEXT("FlatTexture")))return(false); + if(!InitMaterial(&linear, sampler_linear ,OS_TEXT("FlatTexture")))return(false); + if(!InitMaterial(&nearest_hq, sampler_nearest ,OS_TEXT("hqfilter")))return(false); + if(!InitMaterial(&linear_hq, sampler_linear ,OS_TEXT("hqfilter")))return(false); + + if(!InitScene()) + return(false); + + return(true); + } + + void Resize(int w,int h) override + { + BuildCommandBuffer(&render_list); + } +};//class TestApp:public VulkanApplicationFramework + +int main(int,char **) +{ +#ifdef _DEBUG + if(!vulkan::CheckStrideBytesByFormat()) + return 0xff; +#endif// + + TestApp app; + + if(!app.Init()) + return(-1); + + while(app.Run()); + + return 0; +} diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 59155dd8..8f090f65 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -117,7 +117,7 @@ private: sampler=device->CreateSampler(&sampler_create_info); - descriptor_sets->BindSampler(material->GetSampler("texture_lena"),texture,sampler); + descriptor_sets->BindSampler(material->GetSampler("tex"),texture,sampler); descriptor_sets->BindUBO(material->GetUBO("world"),ubo_mvp); descriptor_sets->Update(); diff --git a/res/image/Gear.tga b/res/image/Gear.tga new file mode 100644 index 0000000000000000000000000000000000000000..e56330f49fcf1a5124afbbdc22a10a20840252f7 GIT binary patch literal 49691 zcmeI5O~`Il6~~_&l0r%m1r8eAK?4VNiEz-ML4yo0NJVKlXi!j)5aQqt8UzUq8Z>BN z`BfyL^ns|6gwY4~g_?>L(g#TxSx6RL!mvW(>396!R{NgkIp;lR@3q%C@B8j`A71wJ zoc;McP=l1rCx1YaY`{G|la`hkm`-SbT7j>mbG%7*h58v%3|GjUUUB@@C z>I(k$tFsHX0x1GN{8$I$W1mWYo0R^=&0WFod|*=MmT3rqyWZHr_}8a~o)7;1_h-6- zUwqy6KQ9gDX%EH`_}i~L48MGGJlEjUyD#gC|LMnr8QOz!1fKYG2OuISj~@PbSDe3% z@(^I#1;F1wm{)rH$A`M&U%5Q9_%Sc`ud|&3iSmgGnny@}io*i-f<|)@_|07%bl-Z< z+;ZpT|MqoVCFnwp<|2UV2y{3fO6XU2c9k3xLztcJr=Q#+H_8doamQ;q=>G9sQDs=o zRDvz+VhB?S1N`0x*QnF}=*DiOe8BDJpUoHAf?HeX*RLo7Uxn{^YuBr%?;uZj893R%KQQ{M%l&1u<~}yNR`*O;R11Y~_UQOqZCn*#z%o22u|y8N(#89u^q* zvUGlT|NndYwKs2Z;LIh|6^-}LkIyZ-CqI<{7lv?#7Q`~t@}UN-Ife!?%=NIK2foJ7 z+GO9f)q3CCx6l7<4>G-JT~6Ko|~#B5j_0ZEEt;@RU3VRo3|4@mhu1395bO zfvyR4h8Ag>UDYNwU1i_V(_1d=x;n1QEy#k2;2T!R-gHv2v0`4?riQ3NEEr#`RHXzB z(HxD!0zUZn5HI{t;E!AF^7Gc3$@U71XRqR=fT7Q{=Fv4b_3aNOuycyW*LGLbc4>YHPf*?3S&Vz_%^^wLf-11l_>8_01F(! zp9Rig$y}8M4g4w7pb`tvUZfAVaDoH5fc~rvJ>$%Jr1I~7xT_W`rqMV84}G)>Q22pm zn9Nnr#(R6jo?q75 z+#?-07}14iMk7FRutF163`T+$}w>yVTFM|heY*st;peIw}k|_RUP1dTqKwfx5@0C=07_1|m^(fojNSc{GhHyJ%y3p;`r$_& zk%4S6?2xOC1N}uP%of9`4vW+15nyNOVT0I5zCmLLnJGfSs)WKri=17?u)8-FYzEJ{chl!b9+AOfASp%hs@^KKwTLMsM+D|@4MMb9L>7VtMR%4* zm&`E2#1vIgVGWYofh7=QdD#${Y0NH`e~orIWs|hQ#6!EzUfmR=xT1Qfu+mhK=ONPg zf(x?0+}9o4WCNA7VPD%TXKW5kOi&3`sZP{I_X#68Ohio>v6dMQTb{4~0b~Re8lC%% zAu6O=x=jFpef0{79q@69 z`5(doQ&B9SIY*L15``pybSE9v!f_R|;j*BR50z$q3JXn05czJ$(zR;40*H;*T5}XW z>?WF%?lM1xJx$XP?50sirPN@Va=9bz%#<`Tfn&|ou5k>+lAe!DjwEgLj(#)Q!myPO z=Tqzjh1NIQI>rTT#kf$l{6**Cy*k`2@;c>Y6QSCwF#~(qic%`Oz-t%7)<6*@{zPk8 zh#`~^6tHGGTr3~z0p!%90t;XSHrMoe_Kte@N4XcUlHy6{CUn4;U<5qHHP@TBSWK8p zLpmypg(cIwjDWyF?9@|8Xq0)vB+0gLOQ54sZJLFGVx$jj$6O!7G}Cg>U$jTuDKu&d zjJlzxEFTsT62`^$9O)a6a8c4|nA*JC8Jea80seDtJaIXMLW$*^$3rXmfg zGeb*q7cTc-XqvIpjj&NO=edljQ!|=Q@pm8Hc!k<|5pm0slsd0nc=}j0=aoNAPp_dc zrwrZ&g^&6#5#(zQPeCTdJWWq2>yk$vRCKCkNse?n6HF=QX*#SM+Vlf<`SB6a0ftX! zf+@v3O~-VD{f9k@k;FA6qPbl~s4y zGG5YH2vmxBnl7w%dU5tU`JV}>Sc>BP&o9C{HsPBMQ@n8M8-L|ZyaNaXa<~T>-m${+kw2`~yoMjelT)%#EW+ z>l{fda*vH5V7aB;pgHY6?h$uGaXYBE#C=V-caT(^O&}Z7I0{Tf>LHH8(QmK+B7umP zNK(+3gH(aTJd6hfGCnKw(ipiu|Eb$3IfMGPNldVxUB02 zcn=&MCOQOUaRr=%(}Wy8zDJ*Or@&c9$uJ}kYQ&$*9Ok|5^`fB|4wdWG@xJH&dh=4) zagwkiBGH$SX)Ipwsk92HR^Yn_TuGlt1jUekqtz8CO%ZHXP4aFm=3 z0YxRujxfZex3d?xlNJ{X0bRmnf20zslJ4y*b~JWf9tn12Dcqfnpa!usN+Uu=N0G?3 zjwwiS>G@RXyW!fv6|@}uLN=DL!Uihcdu7tfE@0lWy73Xsa?_C+-;TrrHBgnyQZmdf zAuq14HfWWPC!~m0U3VC#5_FOtv<0e|GkdK_e&i7u$fo@KrMSC=o5CXB0-H-bvG2$< zcD#$UcNF-?FvBHA3|JB@K>MV>lO{7o>fKyWKV`Ns`LiYD-tkWVQA+?2;6-gh;<4D- zK-o-X?DR0_M;zu-&L>*RubChk6^k-@@in9e7d=_6fQ@DZXwXN3Xh$Qq_D@3RCN2?6=6svad9 z)be#B`~waetkIPxER+J%qc+JQfb!EQMF1;|4Y8^>hUONxxYHr8Dviah7edx^gkodL z*NWNOXcqzf&lGT>lJ_I{e;L>v;QD`&>$QeQ2%gH@S;^tQer%`oP{#qBJGgs96*GhU zX*7<2oO15^34UGncWkaU|3~l#93TQH;BqI0cr_Lb0c+sbbH_CnEC{}uc3}aIBf_^h zu3ZCR)Zjxad39&N%uj(TVF6wXqQxX6k(0a|ZNcLkBI4}jY;*}OWQ0isgP*+$I4`qk z90rRMPeDF1+c`@1jiyT{OfOACG-qKFbc4=lO5n+4>zuAVE&~2s7GOAIGTWg!XGU7= z*c3!=*zXEjsCuA7&I9LCMX3<`RkrE26 zak&csTj>Tuey(I=^4rQ~QCKwBs=)8DfPD=uLVFn#nAn)zHNF?~-j6y_atT+K=OpiZ zmd@i$V<3`R#F4U*X>|3BtR55-ze*`pKhYxiI$ev{ZGxFkRW9x(X_zHJk_?2IkX{H~ z8~6f{UNJYA|AeKLleE(eg*@yK*jR??#DjRDu9Hq%L~Q3im~2MR6_BT}%3W#LC)5 zYy{D)kE7Xp#2}qD9Q?quV7JW8?45=4vCMq-#HLXk0vBygY@WUFm7CXZE}7ftjUT%H zhBK#b_{f=)SDbpwc;S=X;}hrpotO2sKhW1}-h1tp??3&%)9-%Qo34B3>8r0iwfQeK CqFmts literal 0 HcmV?d00001 diff --git a/res/image/Yong.tga b/res/image/Yong.tga new file mode 100644 index 0000000000000000000000000000000000000000..766e65666f84ae7cb21d6be067f9d00b111fc086 GIT binary patch literal 49691 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 literal 0 HcmV?d00001 diff --git a/res/image/flat_normal.tga b/res/image/flat_normal.tga new file mode 100644 index 0000000000000000000000000000000000000000..6cb784903ef33c1eb1026f747238b8dd5f96e6ff GIT binary patch literal 66 WcmZQzU}As)76uju35Nd+q#*#Ekq{FA literal 0 HcmV?d00001 diff --git a/res/shader/FlatTexture.frag b/res/shader/FlatTexture.frag index 3d7830ed..f979a503 100644 --- a/res/shader/FlatTexture.frag +++ b/res/shader/FlatTexture.frag @@ -1,11 +1,11 @@ #version 450 core -layout(binding = 2) uniform sampler2D texture_lena; +layout(binding = 2) uniform sampler2D tex; layout(location = 0) in vec2 FragmentTexCoord; layout(location = 0) out vec4 FragColor; void main() { - FragColor=texture(texture_lena,FragmentTexCoord); + FragColor=texture(tex,FragmentTexCoord); } diff --git a/res/shader/Texture2D.vert b/res/shader/Texture2D.vert new file mode 100644 index 00000000..11a4733d --- /dev/null +++ b/res/shader/Texture2D.vert @@ -0,0 +1,16 @@ +#version 450 core + +layout(location = 0) in vec2 Vertex; +layout(location = 1) in vec2 TexCoord; + +layout(location = 0) out vec2 FragmentTexCoord; + +layout(push_constant) uniform Consts { + mat4 local_to_world; +} pc; + +void main() +{ + gl_Position=vec4(Vertex,0.0,1.0)*pc.local_to_world; + FragmentTexCoord=TexCoord; +} diff --git a/res/shader/drand48.frag b/res/shader/drand48.frag new file mode 100644 index 00000000..cb980eb9 --- /dev/null +++ b/res/shader/drand48.frag @@ -0,0 +1,16 @@ +#version 450 core + +layout(location = 0) out vec4 FragColor; + +/* returns a varying number between 0 and 1 */ +float drand48(vec2 co) +{ + return 2 * fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453) - 1; +} + +void main() +{ + float gray=drand48(gl_FragCoord.xy); + + FragColor=vec4(vec3(gray),1.0); +} diff --git a/res/shader/hqfilter.frag b/res/shader/hqfilter.frag new file mode 100644 index 00000000..bc033721 --- /dev/null +++ b/res/shader/hqfilter.frag @@ -0,0 +1,34 @@ +#version 450 core + +layout(binding = 2) uniform sampler2D tex; + +layout(location = 0) in vec2 FragmentTexCoord; +layout(location = 0) out vec4 FragColor; + +vec4 hqfilter(sampler2D samp, vec2 tc) +{ + // Get the size of the texture we'll be sampling from + vec2 texSize = textureSize(samp, 0); + + // Scale our input texture coordinates up, move to center of texel + vec2 uvScaled = tc * texSize + 0.5; + + // Find integer and fractional parts of texture coordinate + vec2 uvInt = floor(uvScaled); + vec2 uvFrac = fract(uvScaled); + + // Replace fractional part of texture coordinate + uvFrac = smoothstep(0.0, 1.0, uvFrac); + + // Reassemble texture coordinate, remove bias, and + // scale back to 0.0 - 1.0 ranage + vec2 uv = (uvInt + uvFrac - 0.5) / texSize; + + // Regular texture lookup + return texture(samp, uv); +} + +void main() +{ + FragColor=hqfilter(tex,FragmentTexCoord); +} diff --git a/res/shader/shader_compile.sh b/res/shader/shader_compile.sh index 62d9f32f..a51bfae0 100755 --- a/res/shader/shader_compile.sh +++ b/res/shader/shader_compile.sh @@ -23,3 +23,8 @@ glslangValidator -V -o gbuffer_composition.frag.spv gbuffer_composition.frag glslangValidator -V -o gbuffer_debug.vert.spv gbuffer_debug.vert glslangValidator -V -o gbuffer_debug.frag.spv gbuffer_debug.frag + +glslangValidator -V -o drand48.frag.spv drand48.frag + +glslangValidator -V -o Texture2D.vert.spv Texture2D.vert +glslangValidator -V -o hqfilter.frag.spv hqfilter.frag \ No newline at end of file