From 4e88d11299c638e2443f6381b0f457e1bde84453 Mon Sep 17 00:00:00 2001 From: blobt Date: Wed, 22 Jul 2020 09:44:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=86=A8=E8=83=80=E5=92=8C=E8=85=90=E8=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/shader3/v14/.suo | Bin 44032 -> 38400 bytes main.cpp | 60 +++++++++++++++++++++++++- res/shader/fullscreenquad_dilation.fs | 20 +++++++++ res/shader/fullscreenquad_erosion.fs | 21 +++++++++ shader3.vcxproj | 2 + shader3.vcxproj.filters | 6 +++ 6 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 res/shader/fullscreenquad_dilation.fs create mode 100644 res/shader/fullscreenquad_erosion.fs diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index 27c3179df5948fb605606d99f1958486fb8a5e54..4787b7e1ea8264ff9bf370af61bc066b6b79c770 100644 GIT binary patch delta 2974 zcmc&$drVVj6u;kX3vGE_q)^_Ef(4<`@=`>EI*U4WJQkyiVkpW}86Xs$x{ZR$6qv|8 z_}a<_b?TW=><=7liDq-UEX$H5)Bk3&m&q_0I%VgSUO>StOO|+(U(fl@_d4fy z&pEx0A9%-Q{+Kz6=RA+Vap9=a`0>QV1X&eOtomrkreq>t>)&s`*L$t>dlrEcj%3)! z?_(F>K3}L@hz7WoW(G@%8XO9T$`=ifdW!WeVW{9y6aFaaOnUSlJpiR2LW2lKOwLYB zM4^tZaNdYeL6eIr+lFAc!w12be~~&44U|h$Mtj6% zh)uR(W*gXIh~uMRI8>>o^r5tsm#IF)!ExBDSimwT7YP}v3$y@QlUIV7SHoy>jwq~z z5n(Iz3-KzJNwc@oOfV+gR8m#B2X?^(u|hm8llp}OHa#=8+$6>7?ywe$?m1F!B+mbp za-?|+6Rjf}j^d1@@TO?C7Q#qCD%kV8#7L`}Qk$PKFWDoD7>ov(ecwlGC&M3n#AL_J zSAgtJGCs}jXJW!ijl0H;xPIz3d%{h%2@O+jJCgwqRUzo9!tKb^B zdajA9!QVQ};7ZiD<^FZ;yWehyAO2&-c(reQkb8fsO$R?4!vuqM-KXBUL$;j(!cUhv zBYu>G#409Sf!-tCFWziuo>)=xQI+i7yHKpY>wPp56dln2D=YiU|D5$cDHlz2=Qzt=BM<#2KgGnsq z$}x;uu8gxk5zeMVd(LXoBCCJdwX<7&W6OUkxh^q!jOD@o=mL$q^HUp@-v!Ho=9o@# z9+px-s)`D+5cY=b_d0^w1{FLADNs^3omzevnuG8d`XivuDceCY{7d ze5TTkf~OZYD`Sd`SD2>*VQYzJDmS&%byVaVCynQM^B-HSSbRbbIPx8?WZt!wcdg+e zu6R@$Ey`i8jl8QsaJ|C2Y&?9sStsc>*D6>Bv~G=HJoIhVvoGO#)rRTp2%ME2u&ufT zzOkiCpI4ieVb)dF7tC+G-c(&yUeTET(3|6e(0c{vgn{~Eh_#1JXRFYf!ursxf8Gr+ z{Fx09n_d-zTf6hA&Sn%8x(@yIHpn||2*7^EJUxx8vCJK(Qo&g%)YYyXJg_~%vyY1m zuf&3E+TK`EQMaqPtbD3?7gjb+m9*cSR-YMGufms27Fb?Q zg1hmdFdUx*(e0ru5U%dEKxbbJ#5z}DX7-$44qbhbQFAw8jw8>qa8;so)Y-_uXRWV- zv`BCcXraH|q@gUJ RZ@oosj{FY>%6}Bi{{Z+btzQ5D delta 2765 zcmcImT}%{L6rMZm4?hFD!pfh*F0jRQ0of%4tgJZ5N-6TUVjE3q!~(0SmRi`Q3R1v`HTbHb5%$oLQ#)G({TQlYD#6 zIdkuwd%kT2IZlTEdwXp>lk5kapf z#G!6Q&^odcmh|m7;%T{%FV&m6Q01!*oMeM?>tNnhBhXB`2WN8GXheotAmt^E+SLLexdYAXAkKWimFlVia zSIde@ReLW4YdZ9khYx?NJlzc=*d{&H5@}@mV^0% zc~%Y&chpCC)RJ5+r7{Q>USJEg&o^@UWU+TN@d zfZZeWU(Q#7#3>NVZ@XVqN8;E1ImLE_?$aaJ10&I zetmnPE8DyOQ)Bsf%L$YD$Ez2%`~aCl+3J^u4fW~i1I5E#=Pr21V~1{MlFB!o6Hj{J zrgGEnVc}w4He>Uo)Be58Xor<$rl&5z!JNAxdUc3Ou&9q2sQCOTYqM_UwoJ`B*x>$MFf*K-Ggc7di z!&SVT9!ZJE*Iits?$ou)VjVMwYx!^sKXK@mo_zqfUo3%N+cQC`cm}%thn3G-_A*60 zKFurBrxRGLACrh!jp5*$G^nKZ#xf?sCz20_2NOoco1!kbJ(FrNLF{dHI|P&h+LbB~}Gbo@{FEY;W)I1&_AvXgzfb+>!+! zM=h&5RNn?^NK%Fewy@+TH30g_pA6tHrGZyFO6Onm9MoPTl0Qk2)87T^F>4zGd_J@X zh6i2%X~fTVLIrGtV-B-&DfAM1(gV}BazK diff --git a/main.cpp b/main.cpp index a95afc9..eea13d8 100644 --- a/main.cpp +++ b/main.cpp @@ -72,6 +72,33 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glewInit(); + //init fsqgpu program + GPUProgram originalProgram; + originalProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs"); + originalProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad.fs"); + originalProgram.Link(); + originalProgram.DetectAttribute("pos"); + originalProgram.DetectAttribute("texcoord"); + originalProgram.DetectUniform("U_MainTexture"); + + //init erosion program + GPUProgram erosionProgram; + erosionProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs"); + erosionProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad_erosion.fs"); + erosionProgram.Link(); + erosionProgram.DetectAttribute("pos"); + erosionProgram.DetectAttribute("texcoord"); + erosionProgram.DetectUniform("U_MainTexture"); + + //init dilation program + GPUProgram dilationProgram; + dilationProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs"); + dilationProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad_dilation.fs"); + dilationProgram.Link(); + dilationProgram.DetectAttribute("pos"); + dilationProgram.DetectAttribute("texcoord"); + dilationProgram.DetectUniform("U_MainTexture"); + //init gpu program GPUProgram gpuProgram; gpuProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/test.vs"); @@ -106,6 +133,17 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glm::mat4 projectionMatrix = glm::perspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f); glm::mat4 normalMatrix = glm::inverseTranspose(model); + //³õʼ»¯fsq + FullScreenQuad fsq; + fsq.Init(); + + //³õʼ»¯FBO + FBO fbo; + fbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight); + fbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); + fbo.Finish(); + + ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); @@ -128,6 +166,8 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glEnable(GL_DEPTH_TEST); glUseProgram(gpuProgram.mProgram); + fbo.Bind(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUniformMatrix4fv(gpuProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos); glUniformMatrix4fv(gpuProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model)); @@ -135,11 +175,29 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glUniformMatrix4fv(gpuProgram.GetLocation("NM"), 1, GL_FALSE, glm::value_ptr(normalMatrix)); obj.Bind(gpuProgram.GetLocation("pos"), gpuProgram.GetLocation("texcoord"), gpuProgram.GetLocation("normal")); obj.Draw(); - + fbo.Unbind(); glUseProgram(0); glFlush(); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color")); + glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0); + + glUseProgram(originalProgram.mProgram); + fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord")); + + + glUseProgram(erosionProgram.mProgram); + fsq.DrawToRightTop(erosionProgram.GetLocation("pos"), erosionProgram.GetLocation("texcoord")); + + glUseProgram(dilationProgram.mProgram); + fsq.DrawToLeftBottom(dilationProgram.GetLocation("pos"), dilationProgram.GetLocation("texcoord")); + SwapBuffers(dc); } return 0; diff --git a/res/shader/fullscreenquad_dilation.fs b/res/shader/fullscreenquad_dilation.fs new file mode 100644 index 0000000..26b1e17 --- /dev/null +++ b/res/shader/fullscreenquad_dilation.fs @@ -0,0 +1,20 @@ +varying vec2 V_Texcoord; + +uniform sampler2D U_MainTexture; + +void main() +{ + vec4 maxValue = vec4(0.0); + int coreSize = 2; + int halfCoreSize = coreSize / 2; + float texelOffset = 1/100.0; + + for(int y=0; y + + diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters index 6a57a6b..cef9a44 100644 --- a/shader3.vcxproj.filters +++ b/shader3.vcxproj.filters @@ -58,5 +58,11 @@ src + + src + + + src + \ No newline at end of file