From 4a734e5b75927b3c557533e9f1a8414776e6158f Mon Sep 17 00:00:00 2001 From: blobt Date: Fri, 14 Aug 2020 09:21:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8skybox=E5=81=9A=E7=90=83?= =?UTF-8?q?=E4=BD=93=E7=9A=84=E5=8F=8D=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/shader3/v14/.suo | Bin 50688 -> 48640 bytes main.cpp | 36 +++++++++++++++++++++++++++++++---- res/shader/skybox_reflect.fs | 13 +++++++++++++ res/shader/skybox_reflect.vs | 18 ++++++++++++++++++ shader3.vcxproj | 4 ++-- shader3.vcxproj.filters | 4 ++-- 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 res/shader/skybox_reflect.fs create mode 100644 res/shader/skybox_reflect.vs diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index 2027f878ac6e2db9afb22b43fada6218cc0bfca3..3a4377e3a51b8650cc8319631455c1ef1b30aabd 100644 GIT binary patch delta 2416 zcmcImeNa?Y6o2bJ0Xyt?jy!@k@YE_zXvLT%*|H#QKrke08%t*~glp)Fy6^KeiJYsKMT4FWMA)V0o8bw}WUW;=*VjUt)k-a4G z&06Q$oc;vZq1(;I;W|I2W#l&0CC&sV9}VLAD7c|F_r#*`4%#E%Xiz>P^Fy*Yl-UrJ z9}7aw53NytXpRcclph@;13`J9H8np(Q+{Zs{9x{~xJ)D{L8=3opnIbHfAV8AnCZYs z$d;HQX8s0`{}yop@dE8V^BJmS~w*N}PJ+YZ4Vy=aSK{y$^_`kI%pEOnSlEuaf zAtT-nr!@uID|lK9+_dI^?=ib^DROFMLY*d4^BX$$R<0Fl`y6n-KObi&B155_yh(D~ zWqbT3CfUvymY^=WKS6pB*m=%ag#s#7RcQPknQaIfzBqCOY>P6D8f1Bdx=;2ls%24h znQCQeFC!zv&D66|`4M6{kY;4kic#Y-6jGH=S_mw~h4gmb&7d>AiUQTWfa`CV;FhbC zJrAwc9_@1|Fu=|7Y9sY5_1vVox8hX>z1bF6e^4h|?O*T~YF+9hx*)ZWh=$t^r-8Dj zFh%)ajbzz)B`WHSe~!v{8Mnv?8j|Ce#D8@FhQ-{_;p&=Nt%wh)hZBYus`$(Ubp`r$Yl{2+X9Sz&s zq2a_bXggucRyapv3odiIvS(VGo9UUN;ourM64P_F92N)_tjU+hCcUFaK#lM|?`}=6 zf`#)7q|7L}y{sBTPb~+_OV70zE`0|CppCMze73wu9vcE`R zBkllyH=g;+O^i;7JPqwqfhuEURA5%FgKNOzZbz5f(B(V7?;99C`)Kf5vc9t6#;1e8 zvJ&H-*ccI{5{|7YLXSdyf7S=N;+3(z%XBMOTs?fqg>EJ3!#R=vtUANAEC&x&8zXHa zGEauw;Ow62kMtG88=9t=FTM9l>P6Wsj5G7!N_}g1Uu_IztQ(a_>$TDB2z>d}JZV!p zQ@omTpI4xJZ58mFE5N_07fx-iU{hhi=1N~952u>kGQVY5BE)X3gR|S6tPiPrT}$ZZ$J%Fy1cs2n(Fo_-b70lJI5w#frQtk^(mi`(qE(F+ zV1mt{)($b@vO2eaMGTc1{Q`t6+&$JlAiT*E7L^pwEq>7B+NBz6i!>Hu^dZY_VB7A2 z+D>B}-M3;=WS&x|bm&)XqGy>YN*&wlB^RS^3{pQMu#Mc8>{n$$0X?H!$Tv;;m&9P}MbgDpw>rJ-E# z4~ZZqIidVn3tWEN0f&cdaQj#cEE&E^&Ll)SLv4XS&T_%X06*aWoDKNrv8hjEpx((g L$EOI+7w7*4cuO~B delta 2369 zcmah~eN0nV6z_esrO<+tJwd4tN(;(ZgbwipA_nig8BYSc)h^m=Ws{ zn-KVAF&dO~N*rMUyHQn#@>#^v41`PJ6N6fM6qf{Tcpg*JcYKAjuMwm}z0xpLs|N3a zm{nTUhjHl$;$;LK1a0_r8SQ;EWQ&%~q6L-pswH0ZL$xtMFT!j@DaYrOM=-iy3X#GE zTZn-T2wgdSOitID7b-l6l5_ls2Q=qWKzB+9wI|2<^CzYvXBf%d1FrR>@ zlX|%85^x(URSefc7M+z-E^n*g0j`lhu|NXx?}D!6KGja#K>^X2>L_1`))l)gf)Qt_ zI>bO!KjNefK?C|%$HQ}@av?e8DyJ10MORI_c-8RGU@Rm9B}wExRp)ZN4_piG6{XOa z=I546*fu6x;H8)aSJNPaTPHQ}=C}g<6KCM=!K9$B^_4K*a65*aibN!xh=|dd6f~j8 zATRARK4Es*^s+V3Ydk0?5>Yaf-0TSDPDbofK-BI;XpAxnmOMX$es{bOf9V|-m15m; zA=LbS*d15Pb0hk#+=#q@q%EbNIl)=g+e;xR<{jHk*yC z7`h6MgU5^nFsBkz1Y`<}kPs!sDxxbzsxS%snY;yNIg{Yhzs8_@x>zWwyvle@ijcDL z3yzu5Yac5?k7vPZr0_L_Wz7CFeT42Cs22Zz#tE=VPJuqsatPH%ZanT)%98wR$KMuGv94q);$deoUDlxD?IM8=O&bs*n9@Yu#r_%#? z%UKAro)WC_a2RXVWRNSmCF-YC;8f_pwNGBlD_>WURbkEfsHo6AKqgST7`Xg89tIZpVf0-*fa{*R86$_@1yvvsg)J#_K=d>_( zUIRBjELComSS7`hdWl`)fR88p1^>Gi2FePxpdNQJa9^wdfKJez2Sw{ZbwI_19M5~m6x`5wX{&b!{Ly0 zV1&&QJ6KBm;3)|eLMw_`7+n_qudW5lbTVY7N5(93)`*KqdWZdaM}ytra_n_2_ks-C Olz`E6I32CaZ1@|3WhHz7 diff --git a/main.cpp b/main.cpp index 2c375bb..0f3f354 100644 --- a/main.cpp +++ b/main.cpp @@ -78,18 +78,31 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ gpuProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/skybox.vs"); gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox.fs"); gpuProgram.Link(); - gpuProgram.DetectAttribute("pos"); gpuProgram.DetectAttribute("texcoord"); gpuProgram.DetectAttribute("normal"); gpuProgram.DetectUniform("M"); gpuProgram.DetectUniform("V"); gpuProgram.DetectUniform("P"); - + + //reflect program + GPUProgram reflectProgram; + reflectProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/skybox_reflect.vs"); + reflectProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox_reflect.fs"); + reflectProgram.Link(); + reflectProgram.DetectAttribute("pos"); + reflectProgram.DetectAttribute("texcoord"); + reflectProgram.DetectAttribute("normal"); + reflectProgram.DetectUniform("M"); + reflectProgram.DetectUniform("V"); + reflectProgram.DetectUniform("P"); + reflectProgram.DetectUniform("NM"); + reflectProgram.DetectUniform("U_MainTexture"); //init 3d model - ObjModel cube; - cube.Init("res/model/Sphere.obj"); + ObjModel cube,sphere; + cube.Init("res/model/Cube.obj"); + sphere.Init("res/model/Sphere.obj"); float identity[] = { 1.0f,0,0,0, @@ -102,6 +115,9 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glm::mat4 cubeModelMatrix; glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f); + glm::mat4 sphereModelMatrix = glm::translate(0.0f, 0.0f, -4.0f); + glm::mat4 sphereNormalMatrix = glm::inverseTranspose(sphereModelMatrix); + GLuint mainTexture = SOIL_load_OGL_cubemap( "res/image/right.bmp", "res/image/left.bmp", @@ -141,6 +157,18 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ cube.Draw(); glUseProgram(0); glEnable(GL_DEPTH_TEST); + + glUseProgram(reflectProgram.mProgram); + glUniformMatrix4fv(reflectProgram.GetLocation("V"), 1, GL_FALSE, identity); + glUniformMatrix4fv(reflectProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); + glUniformMatrix4fv(reflectProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(sphereModelMatrix)); + glUniformMatrix4fv(reflectProgram.GetLocation("NM"), 1, GL_FALSE, glm::value_ptr(sphereNormalMatrix)); + glBindTexture(GL_TEXTURE_CUBE_MAP, mainTexture); + glUniform1i(reflectProgram.GetLocation("U_MainTexture"), 0); + sphere.Bind(reflectProgram.GetLocation("pos"), reflectProgram.GetLocation("texcoord"), reflectProgram.GetLocation("normal")); + sphere.Draw(); + glUseProgram(0); + glFlush(); SwapBuffers(dc); } diff --git a/res/shader/skybox_reflect.fs b/res/shader/skybox_reflect.fs new file mode 100644 index 0000000..bf7c614 --- /dev/null +++ b/res/shader/skybox_reflect.fs @@ -0,0 +1,13 @@ + +varying vec4 V_WorldPos; +varying vec3 V_Normal; + +uniform samplerCube U_MainTexture; + +void main() +{ + vec3 eyeVec = normalize(V_WorldPos.xyz - vec3(0.0)); + vec3 n = normalize(V_Normal); + vec3 r = reflect(eyeVec, n); + gl_FragColor=textureCube(U_MainTexture, r); +} \ No newline at end of file diff --git a/res/shader/skybox_reflect.vs b/res/shader/skybox_reflect.vs new file mode 100644 index 0000000..b2ac37b --- /dev/null +++ b/res/shader/skybox_reflect.vs @@ -0,0 +1,18 @@ +attribute vec3 pos; +attribute vec2 texcoord; +attribute vec3 normal; + +uniform mat4 M; +uniform mat4 P; +uniform mat4 V; +uniform mat4 NM; + +varying vec4 V_WorldPos; +varying vec3 V_Normal; + +void main() +{ + V_WorldPos = M * vec4(pos,1.0); + V_Normal = mat3(NM)*normal; + gl_Position = P * V * V_WorldPos; +} \ No newline at end of file diff --git a/shader3.vcxproj b/shader3.vcxproj index 896190c..b51d56f 100644 --- a/shader3.vcxproj +++ b/shader3.vcxproj @@ -82,8 +82,8 @@ - - + + diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters index 6b906a5..2b9c47d 100644 --- a/shader3.vcxproj.filters +++ b/shader3.vcxproj.filters @@ -46,10 +46,10 @@ - + src - + src