Browse Source

实现specular

master
blobt 4 years ago
parent
commit
98321d04da
  1. 11
      main.cpp
  2. 12
      res/shader/test.fs
  3. 3
      res/shader/test.vs

11
main.cpp

@ -79,6 +79,10 @@ 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_SpecularLightColor");
gpuProgram.DetectUniform("U_SpecularMaterial");
gpuProgram.DetectUniform("U_EyePos");
//init 3d model
ObjModel model;
model.Init("res/model/Sphere.obj");
@ -94,6 +98,9 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
float diffuseLightColor[] = { 1.0f,1.0f,1.0f,1.0f };
float diffuseMaterial[] = { 0.8f,0.8f,0.8f,1.0f };
float lightPos[] = {1.0f,1.0f,0.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<float>(0.0f,0.0f,-3.0f);
glm::mat4 projectionMatrix = glm::perspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
@ -131,6 +138,10 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glUniform4fv(gpuProgram.GetLocation("U_DiffuseLightColor"), 1, diffuseLightColor);
glUniform4fv(gpuProgram.GetLocation("U_DiffuseMaterial"), 1, diffuseMaterial);
glUniform3fv(gpuProgram.GetLocation("U_LightPos"), 1, lightPos);
glUniform4fv(gpuProgram.GetLocation("U_SpecularLightColor"), 1, specularLightColor);
glUniform4fv(gpuProgram.GetLocation("U_SpecularMaterial"), 1, specularMaterial);
glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos);
model.Bind(gpuProgram.GetLocation("pos"), gpuProgram.GetLocation("texcoord"), gpuProgram.GetLocation("normal"));
model.Draw();
glUseProgram(0);

12
res/shader/test.fs

@ -3,9 +3,13 @@ uniform vec4 U_AmbientMaterial;
uniform vec3 U_LightPos;
uniform vec4 U_DiffuseLightColor;
uniform vec4 U_DiffuseMaterial;
uniform vec3 U_EyePos;
uniform vec4 U_SpecularLightColor;
uniform vec4 U_SpecularMaterial;
varying vec3 V_Normal;
varying vec3 V_WorldPos;
void main()
{
@ -18,5 +22,11 @@ void main()
float diffuseIntensity = max(0.0, dot(L,N));
vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * diffuseIntensity;
gl_FragColor = ambientColor + diffuseColor;
//specular
vec3 reflectDir = normalize(reflect(-L,N));//-Lreflect
vec3 viewDir = normalize(U_EyePos - V_WorldPos);
vec4 specularColor = U_SpecularLightColor * U_SpecularMaterial * pow(max(0.0, dot(viewDir,reflectDir)), 64.0);
gl_FragColor = ambientColor + diffuseColor + specularColor;
}

3
res/shader/test.vs

@ -8,8 +8,11 @@ uniform mat4 V;
uniform mat4 NM;//Normal Matrix 使用来修正法线的
varying vec3 V_Normal;
varying vec3 V_WorldPos;
void main()
{
V_Normal = mat3(NM)*normal;
V_WorldPos = M * vec4(pos, 1.0);
gl_Position=P*V*M*vec4(pos,1.0);
}
Loading…
Cancel
Save