fixed some bugs, forward module is working
This commit is contained in:
parent
2381318a09
commit
a00d1ee777
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -2,9 +2,7 @@
|
||||
#define GLASSERT
|
||||
|
||||
/**
|
||||
*
|
||||
* OpenGL error management class.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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)));
|
||||
}
|
||||
|
3
shader.h
3
shader.h
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user