Browse Source

spotlight

master
blobt 4 years ago
parent
commit
c897b96c26
  1. BIN
      .vs/shader3/v14/.suo
  2. 12
      main.cpp
  3. 26
      res/shader/test.fs

BIN
.vs/shader3/v14/.suo

12
main.cpp

@ -79,13 +79,15 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
gpuProgram.DetectUniform("U_DiffuseLightColor"); gpuProgram.DetectUniform("U_DiffuseLightColor");
gpuProgram.DetectUniform("U_DiffuseMaterial"); gpuProgram.DetectUniform("U_DiffuseMaterial");
gpuProgram.DetectUniform("U_LightPos"); gpuProgram.DetectUniform("U_LightPos");
gpuProgram.DetectUniform("U_LightDirection");
gpuProgram.DetectUniform("U_Cutoff");
gpuProgram.DetectUniform("U_SpecularLightColor"); gpuProgram.DetectUniform("U_SpecularLightColor");
gpuProgram.DetectUniform("U_SpecularMaterial"); gpuProgram.DetectUniform("U_SpecularMaterial");
gpuProgram.DetectUniform("U_EyePos"); gpuProgram.DetectUniform("U_EyePos");
//init 3d model //init 3d model
ObjModel model; ObjModel model;
model.Init("res/model/Sphere.obj");
model.Init("res/model/Quad.obj");
float identity[] = { float identity[] = {
1.0f,0,0,0, 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 ambientMaterial[] = { 0.2f,0.2f,0.2f,1.0f };
float diffuseLightColor[] = { 1.0f,1.0f,1.0f,1.0f }; float diffuseLightColor[] = { 1.0f,1.0f,1.0f,1.0f };
float diffuseMaterial[] = { 0.6f,0.6f,0.6f,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 specularLightColor[] = { 1.0f,1.0f,1.0f,1.0f };
float specularMaterial[] = { 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 }; float eyePos[] = { 0.0f,0.0f,0.0f };
glm::mat4 modelMatrix = glm::translate<float>(0.0f,0.0f,-3.0f);
glm::mat4 modelMatrix = glm::translate<float>(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 projectionMatrix = glm::perspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
glm::mat4 normalMatrix = glm::inverseTranspose(modelMatrix); 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_DiffuseLightColor"), 1, diffuseLightColor);
glUniform4fv(gpuProgram.GetLocation("U_DiffuseMaterial"), 1, diffuseMaterial); glUniform4fv(gpuProgram.GetLocation("U_DiffuseMaterial"), 1, diffuseMaterial);
glUniform4fv(gpuProgram.GetLocation("U_LightPos"), 1, lightPos); 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_SpecularLightColor"), 1, specularLightColor);
glUniform4fv(gpuProgram.GetLocation("U_SpecularMaterial"), 1, specularMaterial); glUniform4fv(gpuProgram.GetLocation("U_SpecularMaterial"), 1, specularMaterial);
glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos); glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos);

26
res/shader/test.fs

@ -1,6 +1,8 @@
uniform vec4 U_AmbientLightColor; uniform vec4 U_AmbientLightColor;
uniform vec4 U_AmbientMaterial; uniform vec4 U_AmbientMaterial;
uniform vec4 U_LightPos; uniform vec4 U_LightPos;
uniform vec4 U_LightDirection;
uniform float U_Cutoff;
uniform vec4 U_DiffuseLightColor; uniform vec4 U_DiffuseLightColor;
uniform vec4 U_DiffuseMaterial; uniform vec4 U_DiffuseMaterial;
uniform vec3 U_EyePos; uniform vec3 U_EyePos;
@ -13,6 +15,11 @@ varying vec3 V_WorldPos;
void main() void main()
{ {
//½ÇÈת»¡È
float radianCutoff = U_Cutoff * 3.14 / 180;
float cosThta = cos(radianCutoff);
vec3 spotLightDirection = normalize(U_LightDirection.xyz);
//ambient //ambient
vec4 ambientColor = U_AmbientLightColor * U_AmbientMaterial; vec4 ambientColor = U_AmbientLightColor * U_AmbientMaterial;
@ -36,17 +43,22 @@ void main()
distance = length(U_LightPos.xyz - V_WorldPos); distance = length(U_LightPos.xyz - V_WorldPos);
attenuation = 1.0 / (constantFactor + linearFactor * distance + expFactor * distance * distance); attenuation = 1.0 / (constantFactor + linearFactor * distance + expFactor * distance * distance);
} }
L = normalize(-L);
vec3 N = normalize(V_Normal); vec3 N = normalize(V_Normal);
float diffuseIntensity = max(0.0, dot(L,N));
vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * diffuseIntensity * attenuation;
float currentCosThta = max(0.0, dot(L,spotLightDirection));
float diffuseIntensity = 0.0;
//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;
if(currentCosThta > cosThta){
diffuseIntensity = 0.8;
}
vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * diffuseIntensity * attenuation;
gl_FragColor = ambientColor + diffuseColor + specularColor;
gl_FragColor = ambientColor + diffuseColor;
} }
Loading…
Cancel
Save