From 767ee18e6de04d5b6d0537939fbe02552e63101d Mon Sep 17 00:00:00 2001 From: blobt Date: Wed, 26 Aug 2020 09:17:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=95=E5=BD=B1=E6=9B=B4=E5=A4=9A=E7=8E=A9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/shader3/v14/.suo | Bin 61952 -> 62976 bytes main.cpp | 75 ++++++++++++++++++++++++++++++-- res/shader/projector_shadow.fs | 29 ++++++++++++ res/shader/projector_shadow2.fs | 33 ++++++++++++++ shader3.vcxproj | 2 + shader3.vcxproj.filters | 6 +++ 6 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 res/shader/projector_shadow.fs create mode 100644 res/shader/projector_shadow2.fs diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index d4c656569cab8e19a930bbc9477b205f49496392..1beb327a2d9a8591c274c2ed6aa77f0e968cebd7 100644 GIT binary patch delta 3021 zcmcgu4Nz276yE!G7nbD#yRzVdtFHVg0_wxccFf>Go0_4rN>qx5Vy1>dhDtWYrs7mO z3GV|&9#HU&lX3Q+v zf}J1|`Vsh89LZF|qF_Il+x#o2GnAp)J`Gv=>3TlJ#du6V%)zxKG*(Wyk1&W(N#MS`EhBw7p^7k+!2Ji1taDivp)9&} z+ZO=_tz_zBFl=xigFHwSjfU9cea;?dl?UVOah5N~9{1;rhu9lTx}6YWkF)z1_5zPw zF?+OW{ulO)I#rjH$uQ98d1%yJQ0O_b9EPSi9IR=RW6IEY|%sh#gPKuta2ir>4Gml;HL<^olf@i3pn4ECNOQ^IJh|?)O-zmHno*rE` zw|0g`1G6xSG7rLDbFpf7yub{%^?9YDyEH?!XLf3pEwVBu&NTe4&CUnEU8HmQTda@2 z{Bb%>%@RIRlCtOr`3ASr=#B}o6_90jqXHT65%P|1XU*>xwf`9Qm9w z}!A#kN9LlPoTDHVovc00PIDR@`N66R{KJZo|kDb$Wy8Xa{o%`&aiY^~nXkEDb93Z@`_?c0ao=^`Ge6Hf zeqISs^iYt1fTO(0=b0#Y#_9fZPQ7{dFxYL+iF_&kviMVjMPIPkDHm-Ar};*lX-&Jz zb?57pqDq#pE}K@(;9jQF>-o)y-(4$ujbRh0-(ynG-8qHMZdxWPXRe2Px=ppscwUIo z{QVFWi(1cYowp=Ohor=5fvtW8)dn{If==d{Bm|BmKL;1=hu(9rpdsy9HsI}=>kM~%!moZRH|t3{?6r|7 zX)+>bV+`cgX<&6$J-;ms*nKn^3r|_SYhMlvlL8O$&{|^;-OW6lL4zf)tzw(8qkb-C z?J%LIC5>&MUU6^0^gwTdM`8bR3P!#}Eq zXsV5)+5O$#um)(Ue~i@y<}bBJD>Z4#=4i4#!3>b!Jm}eKgsJ@@j1mlj^TL|X#_+Ej zPMLEvbB>k9Vq5(}Jk#JHc2?7q-=PWl@a-Ie#XHYN@Q<8;FORI_rxCf?7D(;0E)m(- z7nzf+&e~~U7e~OkjV7Gmn5Q&YP`G7k1b-j%FB>O?pNHDUR=Bq$Wv@|vO%F57sZXE_G92lf;)AJPLT$rX>}p*5 zj|q5`WPT1X*uf^vw+cuWyq~Ybal)R=Xa(?lL6M8i;CkS z68H8){Qh*f-pKbqy>FuVzzm2P7PJhDN5R)&s5tl(*z*Z$ z!iOickTbH?{7<_`IW`_C?-jxJ(=qst%cyOR#%NVmI)3{urpmjkm|E5L zsNnfQ@Vp{msp?Q29rStPO+SfwM~YzgPQ%$w5qat&*faXUo#XcG)xrJ^y}mo>+BhY6 zJ9P}>%kxlB?)VcW+E|Rq9*Pr36ELAE6{*>i@Yd;Tu>Euq%Cd7{ZXbd9r_G`>YlOpb Oy);6Sqy@+wlk*3RkBhqi delta 3290 zcmd5;dr*^C7XR*-glBjOLI8yb)TYWp2m#SiHeVh)fwTjt?vx~0EH?3{mZew+|+ihLzShuqeM?1{gI@oa?_+y=}?71B%oF+Wm8EGxLxBY#` z4H82=CE#S8eISL^&cD zL1W~ij6)>&`%;wi5cE0o{qkj$a)#lUAitr(FX#rtWX~>S?CV2{S>d z-!MfVOj)9g&1H!O4X`9ZA7yC~g0e*C1X!YafF-J@qM!ByEJa|Svh)nX&k_?#!%?dL zA6N<#o3`Onwj%}+I}ke&KS2BtF@)HK*o_!Q>_O~B>_dzoMiDgMCjhhhS=mvvjvJt00nj!0tpl8e$h?A9QVn^`c6 zutXGY(Hr=v7&aSj8B;L)N>2vsk+TzFN+LDkP+Gwi2v`}uK(+>zwTN|y=MgU;>JeZK zk5ka1YC*Ik+7NUHI#5~=^u*G>6D6DoUpap>DqH+U>TsdH6^JbXGtC5zY+3XdE&mwG z{xoWMC{+F8s~`UE6f8sanaKJwoZVpXB zx>FI4&X~6ozTpC$Crmd;$%I}*qSN%N-wrN3)3_lj`sVoV1x#f(_m?Y2n7-Wzo-FejvTHr8a-xf!{p;w|Z_ZCY!)l?1fu@l0&0t9=Mfm zP$bG=xJ`li2=bM;M0~#Pf60lSvH(p|UrxRiFwBHj9wf+D+#((e>nRg|Hyi&i^G32- zuvfZB5QpoEm=6!DACgrtQ{y5lz+StXuk0uM;{o(lE(#YOrU$VTbr;wOLbr^*76a)C z(`%(7PXjyAoW?@hqAJ|>iU_6(N6guVjBoZ{vJiJ<4{UAIVTpy%8sIHDT7^QtZOv3E*#cn(n275=B_~r&I zQdsq41svSp3f=qPib4_zC6c!Fn!uRHv(^_Rz}QFybnRaX_fJKG^mIOGmV4p$0fPwF z0F5J=WS8$bJ?{q79G;3cH(_xoqj%BO$I{ieSgpvDUTMhT@^ty%kdinobPcaw#m_!+k7DS_2=BNju@Z3?CuB*DXN?WJ5RIbbCYE6bxtEDTuePBRU zVj3{$%GRsxcCFfM)|YUb3R+4WHj{zc^jvL`b`7VpuP^H0^ktl*rQ4dVZqF@o8a7sI z9R}6%zNYM+%35QyeT}ZRr$*b}Y*V$EHm++i8dh@!x@x_V(;9TeMi*DnqV3&Ov4*pD znrd{mHOp*mFZUa?j_N#4o7+*&m2J>jx((U^uE|i=(^0%G*TJ=R=5hU&uJ+Xqi;8P4 zDlM++w5ghnMcvj-RT$T?-dwt_U}L4V!)VZQ72Q2`<@WL>OR8z?O~M zltK%IJkcQSM70QyIw%iah0DLphU{OIhtd02P6K}HR0?VD-eh5He5t?oLV_%(6.0f, 0.0f, -6.0f) * glm::rotate(-30.0f, 1.0f, 1.0f, 1.0f); - glm::mat4 quadModel = glm::translate(6.0f, -1.5f, -6.0f) * glm::rotate(-90.0f, 1.0f, 0.0f, 0.0f) * glm::scale(10.0f, 10.0f, 10.0f); + glm::mat4 quadModel = glm::translate(6.0f, -1.5f, -6.0f) * glm::rotate(-90.0f, 1.0f, 0.0f, 0.0f) * glm::scale(20.0f, 20.0f, 20.0f); glm::mat4 sphereModel = glm::translate(0.0f, 0.0f, 0.0f) * glm::scale(0.3f, 0.3f, 0.3f); @@ -156,7 +173,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f); glm::mat4 projectorViewMatrix = glm::lookAt(glm::vec3(0.0f, 4.0f, 0.0f), glm::vec3(6.0f, -1.0f, -6.0f), glm::vec3(0.0f, 1.0f, 0.0f)); - glm::mat4 projectorProjectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f); + glm::mat4 projectorProjectionMatrix = glm::perspective(20.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f); glm::mat4 projectorMatrix = glm::translate(0.5f, 0.5f, 0.5f)*glm::scale(0.5f, 0.5f, 0.5f) * projectorProjectionMatrix * projectorViewMatrix; glm::mat4 projectorNoTransScaleMatrix = projectorProjectionMatrix * projectorViewMatrix; @@ -175,6 +192,11 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ projectiveTextureFbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); projectiveTextureFbo.Finish(); + FBO projectiveTextureFbo2; + projectiveTextureFbo2.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight); + projectiveTextureFbo2.AttachDepthBuffer("depth", viewportWidth, viewportHeight); + projectiveTextureFbo2.Finish(); + FBO depthFbo; depthFbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGB, viewportWidth, viewportHeight); depthFbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); @@ -199,13 +221,13 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glUniformMatrix4fv(depthProgram.GetLocation("V"), 1, GL_FALSE, glm::value_ptr(projectorViewMatrix)); obj.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal")); obj.Draw(); - glCullFace(GL_BACK); glUniformMatrix4fv(depthProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(quadModel)); quad.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal")); quad.Draw(); depthFbo.Unbind(); + glCullFace(GL_BACK); /*ԭͼfbo*/ originalFbo.Bind(); @@ -227,6 +249,8 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ originalFbo.Unbind(); /*ͶӰfbo*/ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); projectiveTextureFbo.Bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(projectedTextureProgram.mProgram); @@ -257,6 +281,43 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ quad.Draw(); projectiveTextureFbo.Unbind(); + glDisable(GL_BLEND); + + + /*ͶӰfbo ´øÒõÓ°*/ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + projectiveTextureFbo2.Bind(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUseProgram(projectedTextureProgram2.mProgram); + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model)); + + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("U_ProjectorMatrix"), 1, GL_FALSE, glm::value_ptr(projectorMatrix)); + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("U_ProjectorNoTransScaleMatrix"), 1, GL_FALSE, glm::value_ptr(projectorNoTransScaleMatrix)); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mainTexture); + glUniform1i(projectedTextureProgram2.GetLocation("U_MainTexture"), 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, projectiveTexture); + glUniform1i(projectedTextureProgram2.GetLocation("U_ProjectiveTexture"), 1); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, depthFbo.GetBuffer("depth")); + glUniform1i(projectedTextureProgram2.GetLocation("U_ShadowMap"), 2); + + obj.Bind(projectedTextureProgram2.GetLocation("pos"), projectedTextureProgram2.GetLocation("texcoord"), projectedTextureProgram2.GetLocation("normal")); + obj.Draw(); + + glUniformMatrix4fv(projectedTextureProgram2.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(quadModel)); + quad.Bind(projectedTextureProgram2.GetLocation("pos"), projectedTextureProgram2.GetLocation("texcoord"), projectedTextureProgram2.GetLocation("normal")); + quad.Draw(); + + projectiveTextureFbo2.Unbind(); + glDisable(GL_BLEND); MSG msg; while (true) @@ -292,6 +353,12 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glUniform1i(depthRenderProgram.GetLocation("U_MainTexture"), 0); fsq.DrawToRightBottom(depthRenderProgram.GetLocation("pos"), depthRenderProgram.GetLocation("texcoord")); + glUseProgram(originalProgram.mProgram); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, projectiveTextureFbo2.GetBuffer("color")); + glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0); + fsq.DrawToLeftBottom(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord")); + glFlush(); SwapBuffers(dc); } diff --git a/res/shader/projector_shadow.fs b/res/shader/projector_shadow.fs new file mode 100644 index 0000000..9b4d9a9 --- /dev/null +++ b/res/shader/projector_shadow.fs @@ -0,0 +1,29 @@ + +uniform sampler2D U_ShadowMap; +uniform sampler2D U_ProjectiveTexture; +uniform sampler2D U_MainTexture; + +varying vec2 V_Texcoord; +varying vec3 V_WorldPos; +varying vec4 V_ProjectCoord; +varying vec4 V_ProjectorSpaceFragPos; + +float CalculateShadow(){ + vec3 fragPos = V_ProjectorSpaceFragPos.xyz / V_ProjectorSpaceFragPos.w; + fragPos = fragPos * 0.5 + vec3(0.5); + + float depthInShadowMap = texture2D(U_ShadowMap, fragPos.xy).r; + float currentDepth = fragPos.z; + float shadow = (currentDepth - 0.001) > depthInShadowMap ? 1.0 : 0.0; + return shadow; +} + +void main() +{ + if(V_ProjectCoord.z > 0){ + float shadow = CalculateShadow(); + gl_FragColor = vec4(texture2D(U_MainTexture, V_Texcoord).rgb, textureProj(U_ProjectiveTexture, V_ProjectCoord).a); + } else { + gl_FragColor = texture2D(U_MainTexture, V_Texcoord); + } +} \ No newline at end of file diff --git a/res/shader/projector_shadow2.fs b/res/shader/projector_shadow2.fs new file mode 100644 index 0000000..a8033a8 --- /dev/null +++ b/res/shader/projector_shadow2.fs @@ -0,0 +1,33 @@ + +uniform sampler2D U_ShadowMap; +uniform sampler2D U_ProjectiveTexture; +uniform sampler2D U_MainTexture; + +varying vec2 V_Texcoord; +varying vec3 V_WorldPos; +varying vec4 V_ProjectCoord; +varying vec4 V_ProjectorSpaceFragPos; + +float CalculateShadow(){ + vec3 fragPos = V_ProjectorSpaceFragPos.xyz / V_ProjectorSpaceFragPos.w; + fragPos = fragPos * 0.5 + vec3(0.5); + + float depthInShadowMap = texture2D(U_ShadowMap, fragPos.xy).r; + float currentDepth = fragPos.z; + float shadow = (currentDepth - 0.001) > depthInShadowMap ? 1.0 : 0.0; + return shadow; +} + +void main() +{ + if(V_ProjectCoord.z > 0){ + vec4 color = textureProj(U_ProjectiveTexture, V_ProjectCoord); + if(color.a == 0.0){ + gl_FragColor = texture2D(U_MainTexture, V_Texcoord); + } else { + gl_FragColor = vec4(0.0,0.0,0.0,textureProj(U_ProjectiveTexture, V_ProjectCoord).a); + } + } else { + gl_FragColor = texture2D(U_MainTexture, V_Texcoord); + } +} \ No newline at end of file diff --git a/shader3.vcxproj b/shader3.vcxproj index 2a4b0a6..886a1f7 100644 --- a/shader3.vcxproj +++ b/shader3.vcxproj @@ -85,6 +85,8 @@ + + diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters index 455e138..d3e99f2 100644 --- a/shader3.vcxproj.filters +++ b/shader3.vcxproj.filters @@ -67,5 +67,11 @@ src + + src + + + src + \ No newline at end of file