better blinn-phong, directionnal light at sun position

This commit is contained in:
Anselme 2015-07-01 21:41:22 +02:00
parent 3678b8d392
commit 2d4e2b9727
9 changed files with 41 additions and 21 deletions

View File

@ -12,8 +12,9 @@ void Lights::addLight(const glm::vec3 &myPosition, const glm::vec3 myColor)
}
}
void Lights::bind(GLuint location, Shader* shader)
void Lights::bind(GLuint lightsLocation, GLuint nbLocation, Shader* shader)
{
if(lights.size() > 0)
shader->bindVec3Array(location, (glm::vec3*)lights.data(), lights.size()*2);
shader->bindVec3Array(lightsLocation, (glm::vec3*)lights.data(), lights.size()*2);
shader->bindInteger(nbLocation, (GLuint)lights.size());
}

View File

@ -5,7 +5,7 @@
#include <glew/glew.h>
#include <vector>
#define MAX_LIGHTS 16
#define MAX_LIGHTS 8
class Shader;
@ -21,7 +21,7 @@ private:
std::vector<Light> lights;
public:
void addLight(const glm::vec3 &myPosition = glm::vec3(0), const glm::vec3 myColor = glm::vec3(1));
void bind(GLuint location, Shader* shader);
void bind(GLuint lightsLocation, GLuint nbLocation, Shader* shader);
};
#endif // LIGHT_H

View File

@ -58,7 +58,7 @@ Scene* MyGLWidget::buildScene()
scene->addEntity(myGrid, mat);
scene->addDirectionnalLight(glm::vec3(2, 3, 4), glm::vec3(0.6f, 0.5f, 0.4f));
scene->addDirectionnalLight(glm::vec3(6, 4, -4), glm::vec3(0.7f, 0.6f, 0.4f)); // sun
return scene;
}

View File

@ -5,8 +5,10 @@ uniform vec3 materialKd;
uniform vec3 materialKs;
uniform float materialNs;
uniform vec3 dirLights[32];
uniform vec3 pointLights[32];
uniform int nbDirLights;
uniform vec3 dirLights[16];
uniform int nbPointLights;
uniform vec3 pointLights[16];
// texture
uniform sampler2D baseTexture;
@ -15,8 +17,8 @@ uniform sampler2D baseTexture;
in vec3 varNormal;
in vec2 varTexCoord;
in vec3 lightDirInView[16];
in vec3 halfVecInView[16];
in vec3 lightDirInView[8];
in vec3 halfVecInView[8];
// resultat
layout(location = 0)out vec4 outColor;
@ -36,8 +38,13 @@ vec3 computeLight(in vec3 kd, in vec3 ks, in float ns, in vec3 color, in vec3 no
}
void main(void) {
int i;
vec3 kd = vec3(texture2D(baseTexture, varTexCoord));
vec3 light = 0.1f*kd + computeLight(kd, materialKs, materialNs, dirLights[1], varNormal, lightDirInView[0], halfVecInView[0]);
vec3 light = 0.1f*kd;
for(i=0; i<nbDirLights && i<8; ++i)
light += computeLight(kd, materialKs, materialNs, dirLights[i*2+1], varNormal, lightDirInView[i], halfVecInView[i]);
for(i=0; i<nbPointLights && i+nbDirLights<8; ++i)
light += computeLight(kd, materialKs, materialNs, pointLights[i*2+1], varNormal, lightDirInView[nbDirLights+i], halfVecInView[nbDirLights+i]);
outColor = vec4(light, 1);
}

View File

@ -6,27 +6,39 @@ uniform mat4 MVP;
uniform mat4 normalMatrix;
uniform mat4 viewMatrix;
uniform vec3 dirLights[32];
uniform vec3 pointLights[32];
uniform int nbDirLights;
uniform vec3 dirLights[16];
uniform int nbPointLights;
uniform vec3 pointLights[16];
layout(location = 0)in vec3 inPosition;
layout(location = 1)in vec3 inNormal;
layout(location = 2)in vec4 inTexCoord;
out vec3 lightDirInView[16];
out vec3 halfVecInView[16];
out vec3 lightDirInView[8];
out vec3 halfVecInView[8];
out vec3 varNormal;
out vec2 varTexCoord;
void computeLightingVectorsInView(in vec3 posInView, in vec3 lightPosition, out vec3 lightDir, out vec3 halfVec){
void computeDirectionnalLightingVectorsInView(in vec3 posInView, in vec3 lightDirInWorld, out vec3 lightDir, out vec3 halfVec){
lightDir = mat3(viewMatrix)*lightDirInWorld;
halfVec = normalize(normalize(lightDir) - normalize(posInView));
lightDir = normalize(lightDir);
}
void computePointLightingVectorsInView(in vec3 posInView, in vec3 lightPosition, out vec3 lightDir, out vec3 halfVec){
lightDir = vec3(viewMatrix*vec4(lightPosition, 1.0)) - posInView;
halfVec = normalize(lightDir - posInView);
lightDir = normalize(lightDir);
}
void main(void) {
computeLightingVectorsInView(vec3(modelViewMatrix*vec4(inPosition, 1.0)), dirLights[0], lightDirInView[0], halfVecInView[0]);
int i;
for(i=0; i<nbDirLights && i<8; ++i)
computeDirectionnalLightingVectorsInView(vec3(modelViewMatrix*vec4(inPosition, 1.0)), dirLights[i*2], lightDirInView[i], halfVecInView[i]);
for(i=0; i<nbPointLights && i+nbDirLights<8; ++i)
computePointLightingVectorsInView(vec3(modelViewMatrix*vec4(inPosition, 1.0)), pointLights[i*2], lightDirInView[nbDirLights+i], halfVecInView[nbDirLights+i]);
// normales corrigees (en fonction de la vue)
varNormal = normalize(vec3(normalMatrix*vec4(inNormal,0)));

View File

@ -11,7 +11,7 @@ void PhongMaterial::bindAttributes()
if(tex != NULL)
{
tex->bind(TEX_ID);
shader->bindTexture(shader->getLocation("baseTexture"), TEX_ID);
shader->bindInteger(shader->getLocation("baseTexture"), TEX_ID);
}
}

View File

@ -25,8 +25,8 @@ void Scene::drawAll()
shader->bind();
if(e->getMaterial()->requireLights())
{
directionnalLights.bind(shader->getLocation("dirLights"), shader);
pointLights.bind(shader->getLocation("pointLights"), shader);
directionnalLights.bind(shader->getLocation("dirLights"), shader->getLocation("nbDirLights"), shader);
pointLights.bind(shader->getLocation("pointLights"), shader->getLocation("nbPointLights"), shader);
}
e->draw(viewMatrix, projectionMatrix);
}

View File

@ -132,7 +132,7 @@ void Shader::bindVec3Array(GLuint location, glm::vec3* vec, int nb_elements)
glAssert(glUniform3fv(location, nb_elements, (GLfloat*)vec));
}
void Shader::bindTexture(GLuint location, GLuint tex_id)
void Shader::bindInteger(GLuint location, GLuint tex_id)
{
glAssert(glUniform1i(location, tex_id));
}

View File

@ -25,7 +25,7 @@ public:
void bindMatrix(GLuint location, glm::mat4 mat);
void bindVec3(GLuint location, glm::vec3 vec);
void bindVec3Array(GLuint location, glm::vec3* vec, int nb_elements);
void bindTexture(GLuint location, GLuint tex_id);
void bindInteger(GLuint location, GLuint tex_id);
};
#endif // SHADER_H