From c411d87c69fab520eff8d7cf7298a302ea572401 Mon Sep 17 00:00:00 2001 From: blobt Date: Tue, 18 Aug 2020 09:51:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E8=BF=87depth=20buffer=E5=BE=97?= =?UTF-8?q?=E5=88=B0=E9=98=B4=E5=BD=B1=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/shader3/v14/.suo | Bin 53248 -> 59904 bytes FBO.cpp | 15 ++++---- FBO.h | 2 +- main.cpp | 56 ++++++++++++++++++++++++++---- res/shader/depthrender.fs | 11 ++++++ res/shader/sample_depth_buffer.fs | 4 +++ res/shader/sample_depth_buffer.vs | 12 +++++++ shader3.vcxproj | 4 +++ shader3.vcxproj.filters | 12 +++++++ 9 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 res/shader/depthrender.fs create mode 100644 res/shader/sample_depth_buffer.fs create mode 100644 res/shader/sample_depth_buffer.vs diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index ff4482d09b9471bdc7e726681990e9f209bae925..ed3d7e4f7eafe30cfa41986b450c52ebafb4f384 100644 GIT binary patch delta 6271 zcmeI0dr*|u6~MpyvCGR3-5~Ok!15H4$MT2*QQTb??_MWBt9 zCa}lpfFw=i{YGMJksUJs&yz&Z%-0aBleb(CKj)Da9H4d2u zi$^&DNk*cP^$68_V18@7bk#s23Mt4&M2(P=QZ~vOBnQbw@(`-e$GiY3a+HfP-;Ce_ zb6TVnDMQK;YF~l5FH(h6BQ?m65Yl0SrzBo5CY8W`iEO;iGouMr5x3R$HaoH0g0vzJ ze?u37Wg`+rn>k)5x9}}Xr=P2ADRyk9nYOc+PiEp3cV9LTicP<^4{EcK9XNM54C{lD z)d;C+&*TnyCFUw54yi>Hh;z?qjC-&gj!-`-=I+Q=g!XJ15{S^A`Our`QHVjPBPAuu zvy#o`kFw|Ndq{-Tc?x(}B4?4LVKQLSLiPa3P$v~KXlWlp>K)DNFpokSkZnjKvK?_g zgVuHj(nceAwWHL5gv>rQ-r_9`NEpXS5qHD`@kG23Z)6D~AU?=aWEmnu?m>K!<%l1$ z0`W%z5IGWr&>OGBJj5Y~Vjkv@!!eIQA{n=qi$Wn9i9uE&vB+wK1|Z^5PCycoBt(JS zI##-o{SVAO)8*{rXqK*KPj7at^nPY3m|(x4A2=ADEzSdp|fxwm@8zW%ui%6 z#V3QcNy68ZIV?Q846X-aRHRDs2d9!vLTAu`^bM@?6tAr-VUVXgWyzF- zJnNu+jx$+WAqll<^E!cP#HY+sp6$a?_#$6+&O=TSW_JI>x3GJY@K>DpfPMNLXOU?H3gF+d3+}VK0M{RUhs;l$sf}l%Ts`3?&~Zg4 zyK{7LCP(1m(e5a>Ty+T)^<*+L)OVM{tv*lC_QXouIn4kJDzsjxPTbbfv3oZtlapm5 z6Qg@?JY{+`RemGxbMz@CSl6e4c3-+n&^|3$Q+IOu zQRzLE?@jN))m#C=DKT&+H73);F_U0TW^JRcs}?6!Yt+{_>I|v1cUHmE6LprknnRpr&E9ryK=INcBFN7s?$nK zHF>I@^lf>&jKw)rr%_eps;g8fojY>3t29NbUEA6^lG2(|^Llf-x2SjJq+}TCliIZv z`3;>_*%j^O>ZS%`%C_R}nr-)RJco@qH4@7*i_bH zOlio^ZR_YM!*O@*C@rW-@78u~&(Be-O4`~hH+OEX*KaCTQOaq_E#JANv$QpvPIZp1 z+H)z8V-$fgi8iCi2hsJ3Za^G&KYqMT%$cG~<0DIQsl43%()Tbvts`;=(N_f}nkmgr zv#0^fmd>;2#3o}rJkuSzY>~PJmLH`k^QIfrIvUsI#Oba4LDv)R`rWX}+?nE-cs%oP zd8Wwbohb{Bf{Z(ddOE6H91wU4G@wC8<4FLA%nzW)>Fgf&+#&L~^NioH0m>B-3%yOt za?#%;POmTjUamIZo!k_TltB4{f9QF}7$r|v3J{RJ5dh)Z+^u9f5QTftdCi^5E zBL5uamy~+?FB^hCy7`s;lJ)n;Em3Hfx#{cfTbH3p>05Lex?C@VL*;k-Vb1e5u?u1p zT5r1X*w3&9r!;(;8g$@!=1zCG)_O2cn9&80!QO-BlgxcK8q+zrX*+ecr$p-r%5)i~ z&yv~bi^6PZE}m;9u{NPhUvAXQnc&!|6(Ap%dsM$q-_3ZfSrq_JKM?`Sp;&k&GLR(z zd%*_Q*UiUYRPtaQGg}^i$K{fFI$x456^onB558u>xL)uh+zg77C$9f6toXS7RF!?&4F%@lAw3 zD?;g+QkXpK3)U$mOkes8l*3sIKEGB-<8cc1k(2Lk3#;*b1mYLGvz#JNBrQ~HzQ!}r6++O_J{uAKymUs&x7)^;ZAmNmlo!*14z0! z4vOcsAd}0W?4mp@LQ{C!BkNe*&SkPsUfj3xBh#EUhSBCg{YdzK(@y*sx08PX3G^A6 delta 3730 zcmds4dr*{B6#wqG%d+4HE(pj&mXC)<2)Havq9gdJXp#@mw5%xc0hVGCEKWKFD=OJT z!|#~WIFmV8qnQ-TwZ=&CL$bn3ve_KV$yYVbG}Sn?H3L?3&bq71tI7JKsmuKK+kxks+XVJT;l!bh6NFMSP5@$naYiDO)}{70 zjT0z2793>Ti)TjC>b0I-sP6?t-f`A+6a}q_V+akQj^CoE3Gm$btVPu6LMBm{hyLQB z#G}@O<7PX!Hh^`>Zaj#2U;ZBpf&69bn0A zvC=YO4MPpe1>=CNGbdKATDNq~HO=@#+(DC(ZZE88l6~;kU`E$x)tkZbPl{bguE~^sL%c2 z$^G*K$wm}4c{?EF#iIT>sC2nYQsrO9t6Uc?U{s^{v3MEQ1W(4^c`2x6*NrO0Frmf^4m!p%J zaaJF0400o0VNyPFDFb>J8TJ(p)*!G!?-y;L+?B;$)>H=asJ(uSQumERxJDI9l*6+S zUVX5|)`$H&vD`fMJ)Pd)=YZTbT@ux78{5dM=5J);Zhzi$F9xOcy5~`l{KdE*cXD7D zbJzV6Q?v6VD!i1Py(VCrc~y1|ljb0AH=PHY8th_|;patn!%Rymn*>$EpKT}-)s#H< zgHaTEwZWExNhKRORQYajT`8YRImnpShdDNt%aisq<8&Xc-xVCx@a}0JF+I76_qn)h zFLpk$PNv{r0_+KOCIp4YfyYZjw2(T!%{XT<~|5C6z+ z^wFRb1`XityT-CX1)j)Och(Na(=d8sYL6&`&c7|$_C_zQg?nZhxUte54(Sy z|3~xCVo+)oSlyyaf%sFOlECgrhAu}WO9A$t z248DAy!u2fc~Zkl0}4|4_lLr;7VXoT%R3l51ScO`pnka+(kd2$TG0f@D|5NMQW4d+ zJ4`>+9oo9*yJb(UT$_}5`t-GF?zH{m0Tn{uGK0BwDc7p3ENW_IwiW-{X&L`R z4`e&BZr^HYgOK*veg*c=%jbabxL#Gwfj6T@EwJn9Qv`fVVTs%Cmh6nDTFA9pjX_9D z0u;17ME=*zGg< z%8wO7wlf=QK9WFx>IgjJlt4O@wAcP7gDz(@Ty3+!8@EM3;n}MopEbhV3!{c9m;xu_ zzctH+5*YXCcCepPKsp}gnP&it)9%)9a@Io=4}*ssp zS9LR*&J~KFT(0AF-yC3jwGRAZJR1RZS`k!S*~Ya~3Ij`{;{G@T?R*%RzD(bufferName,colorBuffer)); + mBuffers.insert(std::pair(bufferName, colorBuffer)); glBindFramebuffer(GL_FRAMEBUFFER, 0); } @@ -52,7 +53,7 @@ void FBO::Finish() { GLenum *buffers = new GLenum[nCount]; int i = 0; - while (i < nCount) + while (isecond; } diff --git a/FBO.h b/FBO.h index bbc73d8..b04c2ac 100644 --- a/FBO.h +++ b/FBO.h @@ -12,7 +12,7 @@ public: public: FBO(); //hdr/normal color - void AttachColorBuffer(const char*bufferName,GLenum attachment,GLenum dataType,int width,int height); + void AttachColorBuffer(const char*bufferName, GLenum attachment, GLenum dataType, int width, int height); void AttachDepthBuffer(const char*bufferName, int width, int height); //complete fbo settings void Finish(); diff --git a/main.cpp b/main.cpp index 0db9acf..8e1e9d8 100644 --- a/main.cpp +++ b/main.cpp @@ -81,6 +81,15 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ originalProgram.DetectAttribute("texcoord"); originalProgram.DetectUniform("U_MainTexture"); + //init depth render program + GPUProgram depthRenderProgram; + depthRenderProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs"); + depthRenderProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/depthrender.fs"); + depthRenderProgram.Link(); + depthRenderProgram.DetectAttribute("pos"); + depthRenderProgram.DetectAttribute("texcoord"); + depthRenderProgram.DetectUniform("U_MainTexture"); + //init hdr program GPUProgram hdrProgram; hdrProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs"); @@ -120,6 +129,16 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ lightSourceProgram.DetectUniform("V"); lightSourceProgram.DetectUniform("P"); + //init depth program + GPUProgram depthProgram; + depthProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/sample_depth_buffer.vs"); + depthProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/sample_depth_buffer.fs"); + depthProgram.Link(); + depthProgram.DetectAttribute("pos"); + depthProgram.DetectUniform("M"); + depthProgram.DetectUniform("V"); + depthProgram.DetectUniform("P"); + //init gpu program GPUProgram gpuProgram; @@ -188,6 +207,8 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glm::mat4 viewMatrix = glm::lookAt(glm::vec3(1.0f, 0.5f, -10.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 projectionMatrix = glm::perspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f); + glm::mat4 lightMatrix = glm::lookAt(glm::vec3(0.0f, 10.0f, 0.0f), glm::vec3(0.0f, 0.0f, -2.0f), glm::vec3(0.0f, 0.0f, -1.0f)); + glm::mat4 lightprojectionMatrix = glm::ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.1f, 15.0f); //³õʼ»¯fsq FullScreenQuad fsq; @@ -208,10 +229,34 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ HDRfbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); HDRfbo.Finish(); + FBO depthfbo; + depthfbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGB, viewportWidth, viewportHeight); + depthfbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); + depthfbo.Finish(); + ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + glEnable(GL_DEPTH_TEST); + + depthfbo.Bind(); + glUseProgram(depthProgram.mProgram); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUniformMatrix4fv(depthProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model)); + glUniformMatrix4fv(depthProgram.GetLocation("V"), 1, GL_FALSE, glm::value_ptr(lightMatrix)); + glUniformMatrix4fv(depthProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(lightprojectionMatrix)); + obj.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal")); + obj.Draw(); + + glUniformMatrix4fv(depthProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(quadModel)); + quad.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal")); + quad.Draw(); + + glUseProgram(0); + depthfbo.Unbind(); + + MSG msg; while (true) { @@ -224,7 +269,6 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ TranslateMessage(&msg); DispatchMessage(&msg); } - glEnable(GL_DEPTH_TEST); HDRfbo.Bind(); @@ -311,10 +355,10 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0); fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord")); - glUseProgram(hdrProgram.mProgram); - glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("hdrcolor")); - glUniform1i(hdrProgram.GetLocation("U_MainTexture"), 0); - fsq.DrawToRightTop(hdrProgram.GetLocation("pos"), hdrProgram.GetLocation("texcoord")); + glUseProgram(depthRenderProgram.mProgram); + glBindTexture(GL_TEXTURE_2D, depthfbo.GetBuffer("depth")); + glUniform1i(depthRenderProgram.GetLocation("U_MainTexture"), 0); + fsq.DrawToRightTop(depthRenderProgram.GetLocation("pos"), depthRenderProgram.GetLocation("texcoord")); glUseProgram(gaussianProgram.mProgram); glBindTexture(GL_TEXTURE_2D, fbo[1].GetBuffer("color")); diff --git a/res/shader/depthrender.fs b/res/shader/depthrender.fs new file mode 100644 index 0000000..1a35236 --- /dev/null +++ b/res/shader/depthrender.fs @@ -0,0 +1,11 @@ + +varying vec2 V_Texcoord; + +uniform sampler2D U_MainTexture; + +void main() +{ + float depthValue=texture2D(U_MainTexture,V_Texcoord).r; + depthValue = pow(depthValue, 2); + gl_FragColor=vec4(vec3(depthValue),1.0); +} \ No newline at end of file diff --git a/res/shader/sample_depth_buffer.fs b/res/shader/sample_depth_buffer.fs new file mode 100644 index 0000000..6f62b58 --- /dev/null +++ b/res/shader/sample_depth_buffer.fs @@ -0,0 +1,4 @@ + +void main() +{ +} \ No newline at end of file diff --git a/res/shader/sample_depth_buffer.vs b/res/shader/sample_depth_buffer.vs new file mode 100644 index 0000000..8c7c4f1 --- /dev/null +++ b/res/shader/sample_depth_buffer.vs @@ -0,0 +1,12 @@ +attribute vec3 pos; +attribute vec2 texcoord; +attribute vec3 normal; + +uniform mat4 M; +uniform mat4 P; +uniform mat4 V; + +void main() +{ + gl_Position=P*V*M*vec4(pos,1.0); +} \ No newline at end of file diff --git a/shader3.vcxproj b/shader3.vcxproj index 8c68a39..6170bb0 100644 --- a/shader3.vcxproj +++ b/shader3.vcxproj @@ -82,7 +82,11 @@ + + + + diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters index 51516cc..7c41b47 100644 --- a/shader3.vcxproj.filters +++ b/shader3.vcxproj.filters @@ -49,5 +49,17 @@ src + + src + + + src + + + src + + + src + \ No newline at end of file