diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo index 56039f5..ff1feca 100644 Binary files a/.vs/shader3/v14/.suo and b/.vs/shader3/v14/.suo differ 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