From c897b96c268b85d7a10ef79bd96a0f5f20f47396 Mon Sep 17 00:00:00 2001 From: blobt Date: Tue, 7 Jul 2020 17:27:16 +0800 Subject: [PATCH] spotlight --- .vs/shader3/v14/.suo | Bin 31744 -> 31232 bytes main.cpp | 12 +++++++++--- res/shader/test.fs | 28 ++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index 56039f565f52fdf821d916836ec7c954653ad2e6..ff1feca752a58e2056f3bb922be1842d853b1b7a 100644 GIT binary patch delta 1552 zcmah}U2GIp6ux(6_OG2;wrpFW|0|_i%2I~56i`~1GO49%wj@QjN(c+P(4wHWQ(P6u zNKDkE59}Tvd>}EbBs};)vey`6G_KMYU-*0A#iu?P6CNa+>;r8SIA?dKZf%v5oVn-c zn={|J_uR1_a;v~E>0Co^XTtIZ9=9Wa*uV{^oN8WD)IE#+^UP*s)$?NTHNZ&JE)|q6ruS3k~1w*#wVrg4YdkuN#*ZAN^2Kp{TNq? zV{=7Ry@1YHRFZVtyh>CyqfINl28FhW#%Z&+RYuLg99Ti0@U8z&hCAIM$NQK)DHfYu zQnvO6cQ6O~|0G~B7;#gF%Vo{Z2;7i&h{B+kgVZ#nhA_Kv1)?e9U~L$oGEitAhmqzG zn49O)UPIlA@#+e+FgJ{GFkHHG3ZrfYOWFaAuYrni`mCdfg2k<)8l#!82d3Du85&dR zWa#vk`4&RRci#(eaodne$J+|>i{CM_* zKfdG;=xv3|T7$^-gt-&(j75dBe~D+hq((NwOxDd#;QG-k{Y&S9u}CyIdMJ5+;TL?b zR&4LS!|^&ecWFKeCsn_5B*B7U_1`tqN10;7b5cn|t;BI`AV zjUoN~xtYmWJTcuXtP^3`-UL^8wZm^P_V)9Isi`<*Hc@2$0 MNz_~ljh7%Q6rNeHYsbvSPU6OCoyKc7i5=pkHUg4D5|()TgY#oIjjBrI(5Ok%w4p-n zx~MIJg%hYb5I;_+7p&gk(0WfC5EhM4PlQSp7bFBiLL5NC!jVEH2=6&w<3KNnS$&!} z-^`nR^X8jpR=Byv-%D_|mJD)km1QqqJ99fPtth{~Fu(G_$**|_V@!i*k9pkUguZ$VI?O^66$8@MN!bd!aR64H(6 zLG&W}5X4jKui0_zhcMj!mSMCGBc4M%kMLvolx{iikuA4pi_D_XxuDb2wzLi984M)@ z_oO70PRY`o10IFbur4K>&*GZ9a4j++I9iSd4}JkQBhw0}9fFPgGUN_sWQreeEH2KY zK?7<9k6i4y&*6UmaK2R+0;y(%9fW1HX1PqcBTwfWXk3Ng!xI#VWkhh!-gVD1&bb*p zQhxMP9_{mzJxczS=7gID6Eui>SE{RsuyK(lKK6FYM8HFDJg@3v0Lgs_q-t4FGYVIc zp^LIvl*Xp|CO-_h@XbQAl=rU-x(T`=dkIv=vVty_cC3@e-c>ODDyaV3|MIXZV}gSj z?SxJ>Cg^wn33%?i>fNvBR$dND!t@T5l8h-L*Xsmd99QdpF(VwmEj zc7+*ike$Omo_OuyOLGbF@-Ii_PIYP)!hL@0(BK1}*HffO%g|RjbR6@8??fE5*pP3! z?~Cob7Z3l4{n!epBnYS0t@XJPSKS^T;e`dMa8$~lJ0{rT z-&X?V#Q`v<--gep$1H8BBo&XFPTmD?O$9jvYw?yV!Kz=wqRS3U-e|QzQ04J3t8`(( zq0kGrTgXaY+Tg{@U-6a`HpfKiEZRNr{gp$HWkZhB8y;{Nqn2ry9PY$@;EN}qbv6y@ z)93&1KbK%U*9|`#elU$#;1xE{mf0oL`MV0A##5jTXugO(@ri5f?wN~T-?ty#41NRIfjfTzG5$Q$ diff --git a/main.cpp b/main.cpp index 05832f9..8972606 100644 --- a/main.cpp +++ b/main.cpp @@ -79,13 +79,15 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ gpuProgram.DetectUniform("U_DiffuseLightColor"); gpuProgram.DetectUniform("U_DiffuseMaterial"); gpuProgram.DetectUniform("U_LightPos"); + gpuProgram.DetectUniform("U_LightDirection"); + gpuProgram.DetectUniform("U_Cutoff"); gpuProgram.DetectUniform("U_SpecularLightColor"); gpuProgram.DetectUniform("U_SpecularMaterial"); gpuProgram.DetectUniform("U_EyePos"); //init 3d model ObjModel model; - model.Init("res/model/Sphere.obj"); + model.Init("res/model/Quad.obj"); float identity[] = { 1.0f,0,0,0, @@ -97,12 +99,14 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ float ambientMaterial[] = { 0.2f,0.2f,0.2f,1.0f }; float diffuseLightColor[] = { 1.0f,1.0f,1.0f,1.0f }; float diffuseMaterial[] = { 0.6f,0.6f,0.6f,1.0f }; - float lightPos[] = {3.0f,3.0f,0.0f,1.0f}; + float lightPos[] = {0.0f,1.5f,-3.0f,1.0f}; + float spotLightDirection[] = {0.0f, -1.0f, 0.0f, 1.0f}; + float spotLightCutoff = 15.0f; float specularLightColor[] = { 1.0f,1.0f,1.0f,1.0f }; float specularMaterial[] = { 1.0f,1.0f,1.0f,1.0f }; float eyePos[] = { 0.0f,0.0f,0.0f }; - glm::mat4 modelMatrix = glm::translate(0.0f,0.0f,-3.0f); + glm::mat4 modelMatrix = glm::translate(0.0f, -0.5f, -3.0f) * glm::rotate(-90.0f, 1.0f, 0.0f, 0.0f)*glm::scale(2.0f,2.0f,2.0f); glm::mat4 projectionMatrix = glm::perspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f); glm::mat4 normalMatrix = glm::inverseTranspose(modelMatrix); @@ -138,6 +142,8 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ glUniform4fv(gpuProgram.GetLocation("U_DiffuseLightColor"), 1, diffuseLightColor); glUniform4fv(gpuProgram.GetLocation("U_DiffuseMaterial"), 1, diffuseMaterial); glUniform4fv(gpuProgram.GetLocation("U_LightPos"), 1, lightPos); + glUniform4fv(gpuProgram.GetLocation("U_LightDirection"), 1, spotLightDirection); + glUniform1f(gpuProgram.GetLocation("U_Cutoff"), spotLightCutoff); glUniform4fv(gpuProgram.GetLocation("U_SpecularLightColor"), 1, specularLightColor); glUniform4fv(gpuProgram.GetLocation("U_SpecularMaterial"), 1, specularMaterial); glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos); diff --git a/res/shader/test.fs b/res/shader/test.fs index 598f0f5..6524506 100644 --- a/res/shader/test.fs +++ b/res/shader/test.fs @@ -1,6 +1,8 @@ uniform vec4 U_AmbientLightColor; uniform vec4 U_AmbientMaterial; uniform vec4 U_LightPos; +uniform vec4 U_LightDirection; +uniform float U_Cutoff; uniform vec4 U_DiffuseLightColor; uniform vec4 U_DiffuseMaterial; uniform vec3 U_EyePos; @@ -13,6 +15,11 @@ varying vec3 V_WorldPos; void main() { + //½Ç¶Èת»¡¶È + float radianCutoff = U_Cutoff * 3.14 / 180; + float cosThta = cos(radianCutoff); + vec3 spotLightDirection = normalize(U_LightDirection.xyz); + //ambient vec4 ambientColor = U_AmbientLightColor * U_AmbientMaterial; @@ -36,17 +43,22 @@ void main() distance = length(U_LightPos.xyz - V_WorldPos); attenuation = 1.0 / (constantFactor + linearFactor * distance + expFactor * distance * distance); } - vec3 N = normalize(V_Normal); - float diffuseIntensity = max(0.0, dot(L,N)); - vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * diffuseIntensity * attenuation; + L = normalize(-L); + + vec3 N = normalize(V_Normal); + - //specular blin - vec3 viewDir = normalize(U_EyePos - V_WorldPos); - vec3 M = normalize(L + viewDir); - vec4 specularColor = U_SpecularLightColor * U_SpecularMaterial * pow(max(0.0, dot(M,N)), 64.0) * attenuation; + float currentCosThta = max(0.0, dot(L,spotLightDirection)); + float diffuseIntensity = 0.0; + + if(currentCosThta > cosThta){ + diffuseIntensity = 0.8; + } + + vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * diffuseIntensity * attenuation; - gl_FragColor = ambientColor + diffuseColor + specularColor; + gl_FragColor = ambientColor + diffuseColor; } \ No newline at end of file