diff --git a/CMakeLists.txt b/CMakeLists.txt index bd71da6..73c93fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ set(LIB_SRC_LIST asciientity.cpp asciimodule.cpp framebuffer.cpp - gbuffermodule.cpp + gbuffer.cpp lights.cpp meshbuilder.cpp phongentity.cpp @@ -25,8 +25,9 @@ set(LIB_SRC_LIST skyboxmodule.cpp sparrowrenderer.cpp parametricmesh.cpp - texture.cpp - entityloader.cpp + texture.cpp + deferredmodule.cpp + shadersource.cpp ) set(LIBRARY_NAME ${PROJECT_NAME}) @@ -42,7 +43,9 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug") set(CPP_DEFINES -DRENDER_DEBUG) endif() -add_library(${LIBRARY_NAME} STATIC ${LIB_SRC_LIST}) +file(GLOB LIBRARY_RES_FILES *.h *.frag *.vert) + +add_library(${LIBRARY_NAME} STATIC ${LIB_SRC_LIST} ${LIBRARY_RES_FILES}) add_definitions(-std=c++11 ${CPP_DEFINES}) include_directories( diff --git a/deferredmodule.cpp b/deferredmodule.cpp new file mode 100644 index 0000000..2c1342a --- /dev/null +++ b/deferredmodule.cpp @@ -0,0 +1 @@ +#include "deferredmodule.h" diff --git a/deferredmodule.h b/deferredmodule.h new file mode 100644 index 0000000..8900b44 --- /dev/null +++ b/deferredmodule.h @@ -0,0 +1,34 @@ +#ifndef DEFERREDMODULE_H +#define DEFERREDMODULE_H + +#include "module.h" +#include +#include +#include +#include "lights.h" + +class Shader; +class PhongEntity; + +class DeferredModule : public Module +{ +public: + DeferredModule(Lights::Light* myDirLight, Lights* myPointLights); + + //void addEntity(PhongEntity* myEntity); + //void clearEntities(); + + virtual void renderGL(Camera* myCamera) = 0; + virtual bool requiresModernOpenGL() {return true;} +private: + /*Lights::Light* dirLight; + Lights* pointLights; + GLuint dirLightLocation; + GLuint nbPointLightsLocation; + GLuint pointLightsLocation; + std::vector entities; + + static Shader* shaders[NB_SHADERS];*/ +}; + +#endif // DEFERREDMODULE_H diff --git a/entityloader.cpp b/entityloader.cpp deleted file mode 100644 index 12f79c8..0000000 --- a/entityloader.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "entityloader.h" - -EntityLoader::EntityLoader() -{ - -} - diff --git a/entityloader.h b/entityloader.h deleted file mode 100644 index ce015fb..0000000 --- a/entityloader.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef ENTITYLOADER_H -#define ENTITYLOADER_H - -class EntityLoader -{ -public: - EntityLoader(); -}; - -#endif // ENTITYLOADER_H diff --git a/gbuffer.cpp b/gbuffer.cpp new file mode 100644 index 0000000..8a3bf0c --- /dev/null +++ b/gbuffer.cpp @@ -0,0 +1,56 @@ +#include "gbuffer.h" +#include "sparrowrenderer.h" +#include "glassert.h" + +GBuffer::GBuffer(int width, int height) +{ + glAssert(glGenFramebuffers(1, &fbo)); + glAssert(glBindFramebuffer(GL_FRAMEBUFFER, fbo)); + + // - Normal buffer + glAssert(glGenTextures(1, textures + NORMAL)); + glAssert(glBindTexture(GL_TEXTURE_2D, textures[NORMAL])); + glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[NORMAL], 0)); + + // - Color + Specular exponent buffer + glAssert(glGenTextures(1, textures + COLOR)); + glAssert(glBindTexture(GL_TEXTURE_2D, textures[COLOR])); + glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[COLOR], 0)); + + // - Specular color + objectId buffer + glAssert(glGenTextures(1, textures + SPECULAR)); + glAssert(glBindTexture(GL_TEXTURE_2D, textures[SPECULAR])); + glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, textures[SPECULAR], 0)); + + // - depth buffer + glAssert(glGenTextures(1, textures + DEPTH)); + glAssert(glBindTexture(GL_TEXTURE_2D, textures[DEPTH])); + glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textures[DEPTH], 0)); + + // - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering + GLuint attachments[4] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_DEPTH_ATTACHMENT}; + glAssert(glDrawBuffers(4, attachments)); +} + +void GBuffer::bind() +{ + glAssert(glBindFramebuffer(GL_FRAMEBUFFER, fbo)); +} + +void GBuffer::bindTexture(TextureType type, int slot) +{ + glAssert(glActiveTexture(GL_TEXTURE0 + slot)); + glAssert(glBindTexture(GL_TEXTURE_2D, textures[type])); +} diff --git a/gbuffer.h b/gbuffer.h new file mode 100644 index 0000000..137a808 --- /dev/null +++ b/gbuffer.h @@ -0,0 +1,26 @@ +#ifndef GBUFFER_H +#define GBUFFER_H + +#include + +class GBuffer +{ + // fbo + GLuint fbo; + // textures + enum TextureType + { + NORMAL, + COLOR, + SPECULAR, + DEPTH, + NB_TEXTURES + }; + GLuint textures[NB_TEXTURES]; +public: + GBuffer(int width, int height); + void bind(); + void bindTexture(TextureType type, int slot); +}; + +#endif // GBUFFER_H diff --git a/gbuffermodule.cpp b/gbuffermodule.cpp deleted file mode 100644 index 68e7c92..0000000 --- a/gbuffermodule.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "gbuffermodule.h" -#include "camera.h" -#include "mesh.h" - -void GBufferModule::addMesh(Mesh* myMesh) -{ - -} - -void GBufferModule::renderGL(Camera* myCamera) -{ - -} diff --git a/gbuffermodule.h b/gbuffermodule.h deleted file mode 100644 index e9b2b55..0000000 --- a/gbuffermodule.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef GBUFFERMODULE_H -#define GBUFFERMODULE_H - -#include "module.h" -#include -#include - -class Shader; -class Mesh; - -class GBufferModule : public Module -{ -public: - Shader* shader; - std::vector meshes; - - GBufferModule(Shader* myShader = NULL) : shader(myShader) {} - - void addMesh(Mesh* myMesh); - void virtual renderGL(Camera* myCamera); -}; - -#endif // GBUFFERMODULE_H diff --git a/shadersource.cpp b/shadersource.cpp new file mode 100644 index 0000000..95b722f --- /dev/null +++ b/shadersource.cpp @@ -0,0 +1,29 @@ +#include "shadersource.h" +#include +#include "shader.h" + +ShaderSource::ShaderSource(); + +void ShaderSource::addSource(const char *source, SourceType type) +{ + +} + +Shader* ShaderSource::compile(int nbDefines = 0, const char** defines = NULL) +{ + if(sources[VERTEX] == NULL || sources[FRAGMENT] == NULL) + return NULL; + std::string plop(sources[VERTEX]); + plop.find("#if") + { + + } + + // read lines + + else if(sources[GEOMETRY] != NULL) + return new Shader(sources[VERTEX], sources[GEOMETRY], sources[FRAGMENT]); + else + return new Shader(sources[VERTEX], sources[FRAGMENT]); +} + diff --git a/shadersource.h b/shadersource.h new file mode 100644 index 0000000..949db4e --- /dev/null +++ b/shadersource.h @@ -0,0 +1,29 @@ +#ifndef SHADERSOURCE_H +#define SHADERSOURCE_H + +#include + +class Shader; + +class ShaderSource +{ +public: + enum SourceType + { + VERTEX, + GEOMETRY, + FRAGMENT, + NB_TYPES + }; + + ShaderSource(); + + void addSource(const char *source, SourceType type); + + Shader* compile(int nbDefines = 0, const char** defines = NULL); + +private: + char* sources[NB_TYPES]; +}; + +#endif // SHADERSOURCE_H diff --git a/togbuffer.frag b/togbuffer.frag new file mode 100644 index 0000000..4260fe9 --- /dev/null +++ b/togbuffer.frag @@ -0,0 +1,62 @@ +#version 330 core +layout (location = 0) out vec3 outNormal; +layout (location = 1) out vec4 outColor; +layout (location = 2) out vec4 outSpecular; + +uniform float materialNs; +uniform int objectId; + +#ifdef ALPHA_MASK +uniform sampler2D alphaMask; +#endif + +#ifdef DIFFUSE_TEXTURE +uniform sampler2D diffuseTexture; +#else +uniform vec3 materialKd; +#endif + +#ifdef SPECULAR_TEXTURE +uniform sampler2D specularTexture; +#else +uniform vec3 materialKs; +#endif + +#ifdef NORMAL_MAP +uniform sampler2D normalMap; + +in mat3 tangentSpace; +#else +in vec3 varNormal; +#endif + +in vec2 varTexCoord; + +void main() +{ +#ifdef ALPHA_MASK + if(texture(alphaMask, varTexCoord).r < 0.5) + discard; +#endif + +#ifdef NORMAL_MAP + vec3 varNormal = texture(normalMap, varTexCoord).xyz * tangentSpace; +#endif + outNormal = normalize(varNormal); + +#ifdef DIFFUSE_TEXTURE + outColor.rgb = texture(diffuseTexture, varTexCoord).rgb; +#else + outColor.rgb = materialKd; +#endif + + outColor.a = materialNs; + +#ifdef SPECULAR_TEXTURE + outSpecular.rgb = texture(specularTexture, varTexCoord).rgb; +#else + outSpecular.rgb = materialKs; +#endif + + outSpecular.a = objectId; +} diff --git a/togbuffer.vert b/togbuffer.vert new file mode 100644 index 0000000..fec3961 --- /dev/null +++ b/togbuffer.vert @@ -0,0 +1,41 @@ +#version 330 core + +#ifdef NORMAL_MAP +out mat3 tangentSpace; +#else +out vec3 varNormal; +#endif + +out vec2 varTexCoord; + +// Matrices +uniform mat4 modelViewMatrix; +uniform mat4 MVP; +uniform mat4 viewMatrix; +uniform mat3 normalMatrix; + +layout(location = 0)in vec3 inPosition; +layout(location = 1)in vec2 inTexCoord; +layout(location = 2)in vec3 inNormal; +#ifdef NORMAL_MAP +layout(location = 3)in vec3 inTangent; +layout(location = 4)in vec3 inBinormal; +#endif + +out vec3 varNormal; +out vec2 varTexCoord; + +void main(void) +{ +#ifdef NORMAL_MAP + tangentSpace = mat3(normalize(normalMatrix*inNormal), + normalize(normalMatrix*inTangent), + normalize(normalMatrix*inBinormal)); +#else + varNormal = normalize(normalMatrix*inNormal); +#endif + + varTexCoord = inTexCoord.xy; + + gl_Position = MVP * vec4(inPosition, 1.0); +}