fixed some bugs, forward module is working

This commit is contained in:
anselme 2015-11-29 22:32:44 +01:00
parent 2381318a09
commit a00d1ee777
12 changed files with 56 additions and 28 deletions

View File

@ -79,6 +79,10 @@ void main(void) {
vec3 specular = materialKs;
#endif
#ifdef AMBIENT_LIGHT
outColor = vec4(ambient + lightColor*diffuse, 1);
#else
vec3 light = phongLighting(diffuse, specular, materialNs, lightColor, normal, lightDirInView, halfVecInView);
outColor = vec4(ambient + light, 1);
outColor = vec4(light, 1);
#endif
}

View File

@ -22,8 +22,8 @@ uniform vec3 pointLight;
#endif
layout(location = 0)in vec3 inPosition;
layout(location = 1)in vec2 inTexCoord;
layout(location = 2)in vec3 inNormal;
layout(location = 2)in vec2 inTexCoord;
layout(location = 1)in vec3 inNormal;
#ifdef NORMAL_MAP
layout(location = 3)in vec3 inTangent;
layout(location = 4)in vec3 inBinormal;

View File

@ -4,6 +4,7 @@
#include "mesh.h"
#include "shader.h"
#include "light.h"
#include "glassert.h"
#include <glm/ext.hpp>
const char* const ForwardModule::flagStr[] =
@ -25,19 +26,34 @@ const char* const ForwardModule::lightStr[] =
void ForwardModule::renderGL(Camera* myCamera, Scene* scene)
{
// render ambient lighting
lightPass(NULL, myCamera, scene, AMBIENT_LIGHT);
glAssert(glClearColor(0, 0.1f, 0.05f, 1.)); // add attribute, and setter for clear color
glAssert(glClearDepth(1.0));
glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
glAssert(glDepthFunc(GL_LESS));
glAssert(glDisable(GL_BLEND));
lightPass(myCamera, scene, NULL, AMBIENT_LIGHT);
// render directionnal lighting and point lighting
glAssert(glDepthFunc(GL_LEQUAL));
glAssert(glEnable(GL_BLEND));
glAssert(glBlendFunc(GL_ONE, GL_ONE));
glAssert(glDepthMask(GL_FALSE));
for(SceneIterator<Light*>* lightIt = scene->getLights();
lightIt->isValid(); lightIt->next())
{
Light* l = lightIt->getItem();
unsigned int type = l->isDirectionnal() ? DIRECTIONNAL_LIGHT : POINT_LIGHT;
lightPass(l, myCamera, scene, type);
}
lightPass(myCamera, scene, l, type);
}
void ForwardModule::lightPass(Light* light, Camera* myCamera, Scene* scene, unsigned int type)
glAssert(glDisable(GL_BLEND));
glAssert(glDepthFunc(GL_LESS));
glAssert(glDepthMask(GL_TRUE));
}
void ForwardModule::lightPass(Camera* myCamera, Scene* scene, Light* light, unsigned int type)
{
// loop over all types of geometry
for(int i=0; i<flags.size(); ++i)
@ -67,15 +83,15 @@ void ForwardModule::lightPass(Light* light, Camera* myCamera, Scene* scene, unsi
// loop over material groups
for(int j=0; j<entity->getMesh()->indiceGroups.size(); ++j)
{
Material* mat = entity->getMesh()->indiceGroups[i].material;
Material* mat = entity->getMesh()->indiceGroups[j].material;
if(mat->getFlags() == flags[i])
{
// bind material attributes
mat->bindAttributes(shader);
shader->bindMatrix(shader->getLocation("viewMatrix"), myCamera->getViewMatrix());
shader->bindMatrix(shader->getLocation("modelViewMatrix"), modelViewMatrix);
shader->bindMatrix(shader->getLocation("normalMatrix"), normalMatrix);
shader->bindMatrix(shader->getLocation("MVP"), mvp);
shader->bindMat4(shader->getLocation("viewMatrix"), myCamera->getViewMatrix());
shader->bindMat4(shader->getLocation("modelViewMatrix"), modelViewMatrix);
shader->bindMat3(shader->getLocation("normalMatrix"), glm::mat3(normalMatrix));
shader->bindMat4(shader->getLocation("MVP"), mvp);
// draw geometry
entity->drawGroup(j);
}
@ -88,11 +104,18 @@ void ForwardModule::lightPass(Light* light, Camera* myCamera, Scene* scene, unsi
void ForwardModule::setShaderSource(ShaderSource* source)
{
if(shaderSources != NULL)
delete(shaderSources);
shaderSources = source;
}
void ForwardModule::compileShaders(Scene* scene)
{
flags.clear();
for(Shader* s : shaders)
delete(s);
shaders.clear();
int size = 1 << NB_FLAGS;
bool geometryFlags[size];
for(int i=0; i<size; ++i)

View File

@ -18,7 +18,7 @@ public:
ForwardModule() : shaderSources(NULL) {}
virtual void renderGL(Camera* myCamera, Scene* scene);
virtual bool requiresModernOpenGL() {return false;}
virtual bool requiresModernOpenGL() {return true;} // write some compatibility code to change that to false
// modern opengl methods
@ -42,7 +42,7 @@ private:
std::vector<Shader*> shaders;
std::vector<unsigned int> flags;
void lightPass(Light* light, Camera* myCamera, Scene* scene, unsigned int type);
void lightPass(Camera* myCamera, Scene* scene, Light* light, unsigned int type);
};
#endif // FORWARDMODULE_H

View File

@ -2,9 +2,7 @@
#define GLASSERT
/**
*
* OpenGL error management class.
*
*/
#include <iostream>

View File

@ -36,10 +36,10 @@ void PhongEntity::modernDraw(const glm::mat4 &viewMatrix, const glm::mat4 &proje
PhongMaterial* mat = (PhongMaterial*)mesh->indiceGroups[i].material;
mat->bindAttributes();
Shader* shader = mat->getShader();
shader->bindMatrix(shader->getLocation("viewMatrix"), viewMatrix);
shader->bindMatrix(shader->getLocation("modelViewMatrix"), modelViewMatrix);
shader->bindMatrix(shader->getLocation("normalMatrix"), normalMatrix);
shader->bindMatrix(shader->getLocation("MVP"), mvp);
shader->bindMat4(shader->getLocation("viewMatrix"), viewMatrix);
shader->bindMat4(shader->getLocation("modelViewMatrix"), modelViewMatrix);
shader->bindMat4(shader->getLocation("normalMatrix"), normalMatrix);
shader->bindMat4(shader->getLocation("MVP"), mvp);
shader->bindVec3Array(shader->getLocation("dirLight"), (glm::vec3*)dirLight, 2);
pointLights->bind(shader->getLocation("pointLights"), shader->getLocation("nbPointLights"), shader);
drawGroup(i);

View File

@ -36,6 +36,8 @@ void PhongModule::clearEntities()
void PhongModule::renderGL(Camera* myCamera, Scene* scene)
{
glAssert(glClearColor(0, 0, 0, 1.0));
glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
if(!SparrowRenderer::isModernOpenGLAvailable())
{
glLoadIdentity();

View File

@ -160,7 +160,12 @@ void Shader::bindFloat(GLuint location, float val)
glAssert(glUniform1f(location, val));
}
void Shader::bindMatrix(GLuint location, glm::mat4 mat)
void Shader::bindMat3(GLuint location, glm::mat3 mat)
{
glAssert(glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(mat)));
}
void Shader::bindMat4(GLuint location, glm::mat4 mat)
{
glAssert(glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(mat)));
}

View File

@ -21,7 +21,8 @@ public:
void bind();
void unbind();
void bindFloat(GLuint location, float val);
void bindMatrix(GLuint location, glm::mat4 mat);
void bindMat3(GLuint location, glm::mat3 mat);
void bindMat4(GLuint location, glm::mat4 mat);
void bindVec3(GLuint location, glm::vec3 vec);
void bindVec4(GLuint location, glm::vec4 vec);
void bindVec3Array(GLuint location, glm::vec3* vec, int nb_elements);

View File

@ -3,8 +3,6 @@
#include <sstream>
#include "shader.h"
#include <iostream>
ShaderSource::ShaderSource()
{
for(int i=0; i<NB_TYPES; ++i)
@ -78,6 +76,5 @@ std::string ShaderSource::preprocess(std::string source, int nbDefines, const ch
else if(allowed)
compiled.append(line+'\n');
}
std::cout << compiled << std::endl;
return compiled;
}

View File

@ -66,7 +66,7 @@ void SkyboxModule::renderGL(Camera* myCamera, Scene* scene)
else
{
shader->bind();
shader->bindMatrix(mvpLocation, projectionMatrix * viewMatrix);
shader->bindMat4(mvpLocation, projectionMatrix * viewMatrix);
}
cubeMap->bind(0);
glAssert(glBindVertexArray(vao));

View File

@ -57,8 +57,6 @@ void SparrowRenderer::resizeGL(int width, int height)
void SparrowRenderer::renderGL()
{
glAssert(glClearColor(0, 0, 0, 1.0));
glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
for(ModuleNode &m : modules)
{
if(m.isEnabled)