Back to basic - Just a backpack rendering
This commit is contained in:
@ -1,84 +0,0 @@
|
||||
#include "OutlinePass.h"
|
||||
#include "Renderer.h"
|
||||
#include "../../CheckErrors.h"
|
||||
|
||||
OutlinePass::OutlinePass(Model& sceneObject, glm::mat4& model, glm::mat4& projection, Camera& camera)
|
||||
: RenderPass("Renderpass - Outline", "../Shaders/shader.vs", "../Shaders/outlineshader.fs" ) , m_model(sceneObject), camera(camera), projection(projection), model(model)
|
||||
{
|
||||
}
|
||||
|
||||
void OutlinePass::Create() {
|
||||
// Framebuffer outline effect
|
||||
std::cout << "Create Framebuffer" << std::endl;
|
||||
|
||||
m_outlineFrameBuffer = new FrameBuffer();
|
||||
glCheckError();
|
||||
|
||||
m_outlineFrameBuffer->Bind();
|
||||
glCheckError();
|
||||
|
||||
// Create a texture attachment (colour attachment)
|
||||
std::cout << "Create Texture" << std::endl;
|
||||
m_colourTexture = CreateTexture(800, 600);
|
||||
glCheckError();
|
||||
|
||||
// attach texture to the frame buffer as a colour attachment
|
||||
m_outlineFrameBuffer->Attach(*m_colourTexture);
|
||||
glCheckError();
|
||||
|
||||
// Add depth buffer attachment
|
||||
std::cout << "Create RenderBuffer" << std::endl;
|
||||
m_outlineRenderBuffer = new RenderBuffer();
|
||||
glCheckError();
|
||||
|
||||
m_outlineRenderBuffer->Bind();
|
||||
glCheckError();
|
||||
|
||||
m_outlineRenderBuffer->UseDepthAndStencil();
|
||||
glCheckError();
|
||||
|
||||
m_outlineRenderBuffer->Unbind();
|
||||
glCheckError();
|
||||
|
||||
// attach depth buffer to our framebuffer
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_outlineRenderBuffer->id);
|
||||
glCheckError();
|
||||
|
||||
m_outlineFrameBuffer->Unbind();
|
||||
glCheckError();
|
||||
|
||||
std::cout << "Success!" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
OutlinePass::~OutlinePass(){
|
||||
delete m_colourTexture;
|
||||
delete m_outlineRenderBuffer;
|
||||
}
|
||||
|
||||
void OutlinePass::Render()
|
||||
{
|
||||
std::cout << "Start outline render" << std::endl;
|
||||
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
|
||||
glStencilMask(0x00);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
m_shader.use();
|
||||
m_shader.setMat4("model", model);
|
||||
m_shader.setMat4("view", camera.GetViewMatrix());
|
||||
m_shader.setMat4("projection", projection);
|
||||
m_shader.setVec3("outlineColor", glm::vec3(0.28, 0.10, 0.26));
|
||||
|
||||
model = glm::scale(model, glm::vec3(1.05f,1.05f, 1.05f));
|
||||
m_shader.setMat4("model", model);
|
||||
|
||||
std::cout << "Drawing model" << std::endl;
|
||||
m_model.Draw(m_shader);
|
||||
|
||||
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xff);
|
||||
glStencilMask(0xFF);
|
||||
|
||||
std::cout << "Finished outline render" << std::endl;
|
||||
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
#include <glm/glm.hpp>
|
||||
#include "RenderPass.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "../model.h"
|
||||
#include "../Primitives/texture.h"
|
||||
#include "../Primitives/camera.h"
|
||||
|
||||
class OutlinePass : RenderPass {
|
||||
|
||||
public:
|
||||
void Render() override;
|
||||
|
||||
OutlinePass (Model& sceneObject, glm::mat4& model , glm::mat4& projection, Camera& camera) ;
|
||||
void Create();
|
||||
~OutlinePass();
|
||||
|
||||
private:
|
||||
FrameBuffer* m_outlineFrameBuffer;
|
||||
RenderBuffer* m_outlineRenderBuffer;
|
||||
Texture* m_colourTexture;
|
||||
|
||||
glm::mat4 model;
|
||||
glm::mat4 projection;
|
||||
|
||||
Model& m_model;
|
||||
Camera& camera;
|
||||
|
||||
};
|
@ -1,7 +1,7 @@
|
||||
#include "RenderBuffer.h"
|
||||
|
||||
void RenderBuffer::UseDepthAndStencil (){
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600); /// NOTE: should be part of creating but kept seperate for now!
|
||||
void RenderBuffer::UseDepthAndStencil (int width, int height){
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); /// NOTE: should be part of creating but kept seperate for now!
|
||||
}
|
||||
|
||||
void RenderBuffer::Bind()
|
||||
|
@ -10,7 +10,7 @@ public:
|
||||
void Bind();
|
||||
void Unbind();
|
||||
|
||||
void UseDepthAndStencil();
|
||||
void UseDepthAndStencil(int width, int height);
|
||||
|
||||
RenderBuffer();
|
||||
~RenderBuffer();
|
||||
|
@ -1,19 +0,0 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include "../Primitives/shader.h"
|
||||
|
||||
class RenderPass {
|
||||
public :
|
||||
virtual void Render() = 0;
|
||||
|
||||
RenderPass(const std::string& name,const std::string& VertexShaderFile, const std::string& FragmentShaderFile) : m_shader(VertexShaderFile.c_str(), FragmentShaderFile.c_str())
|
||||
{
|
||||
std::cout << "Created " << name << std::endl;
|
||||
}
|
||||
|
||||
~RenderPass(){}
|
||||
|
||||
protected:
|
||||
Shader m_shader;
|
||||
|
||||
};
|
@ -9,60 +9,131 @@
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include "../Primitives/Scene.h"
|
||||
void Renderer::Setup()
|
||||
{
|
||||
shader.Load("../Shaders/Framebuffers.vs", "../Shaders/Framebuffers.fs");
|
||||
|
||||
// Create ScreenVAO
|
||||
glGenVertexArrays(1, &ScreenVAO);
|
||||
glBindVertexArray(ScreenVAO);
|
||||
|
||||
glGenBuffers(1, &VBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
|
||||
glBufferData(GL_ARRAY_BUFFER, ScreenVertices.size() * sizeof(float), &ScreenVertices[0], GL_STATIC_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
|
||||
glEnableVertexAttribArray(1);
|
||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
|
||||
|
||||
glBindVertexArray(0);
|
||||
|
||||
// Enable features
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
}
|
||||
void Renderer::resize(int width, int height ) {
|
||||
framebuffer = FrameBuffer();
|
||||
|
||||
framebuffer.Bind();
|
||||
|
||||
|
||||
ColourBuffer = CreateTexture(800,600);
|
||||
|
||||
ColourBuffer = CreateTexture(width, height);
|
||||
|
||||
framebuffer.Attach(*ColourBuffer);
|
||||
|
||||
renderbufferObject = RenderBuffer();
|
||||
|
||||
renderbufferObject.Bind();
|
||||
|
||||
renderbufferObject.UseDepthAndStencil();
|
||||
|
||||
renderbufferObject.Unbind();
|
||||
|
||||
renderbufferObject.UseDepthAndStencil(width, height);
|
||||
|
||||
framebuffer.Attach(renderbufferObject);
|
||||
|
||||
if(framebuffer.IsComplete() == false ){
|
||||
std::cout << "ERROR::FRAMEBUFFER::Framebuffer is not complete! " << std::endl;
|
||||
}
|
||||
if (framebuffer.IsComplete() == false) {
|
||||
std::cout << "ERROR::FRAMEBUFFER::Framebuffer is not complete! " << std::endl;
|
||||
}
|
||||
|
||||
renderbufferObject.Unbind();
|
||||
|
||||
framebuffer.Unbind();
|
||||
}
|
||||
|
||||
void Renderer::Render( )
|
||||
|
||||
void Renderer::Render(Scene& scene)
|
||||
{
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
glm::mat4 projection = glm::perspective(glm::radians(scene.cameras.Zoom), (float)800 / (float)600, 0.1f, 100.0f);
|
||||
auto view = scene.cameras.GetViewMatrix();
|
||||
auto model = glm::mat4(1.0f);
|
||||
|
||||
// Recalculate the Camera's view matrix
|
||||
view = camera.GetViewMatrix();
|
||||
// Reset the model matrix to an identity matrix
|
||||
model = glm::mat4(1.0f);
|
||||
|
||||
framebuffer.Bind();
|
||||
|
||||
// 1. Skybox pass
|
||||
skyboxpass.Render();
|
||||
/*
|
||||
Shader cubemap;
|
||||
cubemap.Load("../Shaders/skybox.vs", "../Shaders/Cubemap.fs");
|
||||
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
cubemap.use();
|
||||
|
||||
cubemap.setMat4("projection", projection);
|
||||
auto centeredView = glm::mat4(glm::mat3(scene.cameras.GetViewMatrix()));
|
||||
cubemap.setMat4("view", centeredView);
|
||||
|
||||
skybox.Bind();
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
|
||||
skybox.Unbind();
|
||||
|
||||
glDepthMask(GL_TRUE);
|
||||
*/
|
||||
|
||||
|
||||
// 2. Scene pass
|
||||
scenepass.Render();
|
||||
Shader blinnPhong;
|
||||
blinnPhong.Load("../Shaders/shader.vs", "../Shaders/shader.fs");
|
||||
|
||||
blinnPhong.use();
|
||||
blinnPhong.setVec3("cameraPos", scene.cameras.Position);
|
||||
|
||||
/*
|
||||
glActiveTexture(GL_TEXTURE11);
|
||||
m_skybox.Bind(); // Segmentation Fault HERE!!
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
*/
|
||||
|
||||
blinnPhong.setInt("skybox", 11);
|
||||
|
||||
blinnPhong.setMat4("model", model);
|
||||
blinnPhong.setMat4("view", view);
|
||||
blinnPhong.setMat4("projection", projection);
|
||||
|
||||
for (auto entity : scene.entities) {
|
||||
entity.Draw(blinnPhong);
|
||||
}
|
||||
|
||||
// m_skybox.Unbind();
|
||||
|
||||
// 3. outline pass
|
||||
|
||||
outlinepass.Render();
|
||||
//Shader OutlineShader;
|
||||
//OutlineShader.Load("../Shaders/shader.vs", "../Shaders/outlineshader.fs");
|
||||
|
||||
|
||||
/*
|
||||
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
*/
|
||||
|
||||
// 4. draw result to screen
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
/*glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
@ -70,8 +141,8 @@ void Renderer::Render( )
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
|
||||
m_shader.use();
|
||||
m_shader.setInt("screenTexture",0);
|
||||
shader.use();
|
||||
shader.setInt("screenTexture",0);
|
||||
glBindVertexArray(ScreenVAO);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, ColourBuffer->id);
|
||||
@ -83,57 +154,20 @@ void Renderer::Render( )
|
||||
glStencilMask(0xFF);
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
Renderer::Renderer(Camera& camera, Model& scene) :
|
||||
camera(camera),
|
||||
renderbufferObject(),
|
||||
framebuffer(),
|
||||
skybox(),
|
||||
skyboxpass(skybox, camera, projection),
|
||||
scenepass(skybox, scene,camera,projection, model),
|
||||
outlinepass(scene, model, projection, camera),
|
||||
m_shader("../Shaders/Framebuffers.vs", "../Shaders/Framebuffers.fs")
|
||||
{
|
||||
void Renderer::Shutdown() {
|
||||
|
||||
framebuffer.Unbind();
|
||||
}
|
||||
|
||||
outlinepass.Create();
|
||||
|
||||
|
||||
std::vector<std::string> faces = {
|
||||
"../Textures/skybox/right.jpg",
|
||||
"../Textures/skybox/left.jpg",
|
||||
"../Textures/skybox/top.jpg",
|
||||
"../Textures/skybox/bottom.jpg",
|
||||
"../Textures/skybox/front.jpg",
|
||||
"../Textures/skybox/back.jpg"
|
||||
};
|
||||
skybox.loadCubeTextures(faces);
|
||||
Renderer::Renderer() {
|
||||
|
||||
|
||||
|
||||
// auto outlinepass = OutlinePass(scene , model, projection, camera);
|
||||
// Create ScreenVAO
|
||||
glGenVertexArrays(1, &ScreenVAO);
|
||||
glBindVertexArray(ScreenVAO);
|
||||
|
||||
glGenBuffers(1, &VBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
|
||||
glBufferData(GL_ARRAY_BUFFER, ScreenVertices.size() * sizeof(float), &ScreenVertices[0], GL_STATIC_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0,2, GL_FLOAT,GL_FALSE, 4 * sizeof(float),(void*) 0 );
|
||||
glEnableVertexAttribArray(1);
|
||||
glVertexAttribPointer(1,2,GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2*sizeof(float)));
|
||||
|
||||
glBindVertexArray(0);
|
||||
|
||||
// Enable features
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -5,39 +5,26 @@
|
||||
#include "../Primitives/shader.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "ScenePass.h"
|
||||
#include "OutlinePass.h"
|
||||
#include "SkyboxPass.h"
|
||||
|
||||
#include "../Primitives/Scene.h"
|
||||
|
||||
class Renderer
|
||||
{
|
||||
public:
|
||||
void Render();
|
||||
void Setup();
|
||||
|
||||
Renderer(Camera& camera,Model& scene);
|
||||
Renderer();
|
||||
~Renderer();
|
||||
|
||||
|
||||
private:
|
||||
ScenePass scenepass;
|
||||
SkyboxPass skyboxpass;
|
||||
OutlinePass outlinepass;
|
||||
void Setup();
|
||||
void resize(int width, int height);
|
||||
void Render(Scene& scene);
|
||||
void Shutdown();
|
||||
|
||||
Camera& camera;
|
||||
|
||||
private:
|
||||
GLuint ScreenVAO, VBO;
|
||||
FrameBuffer framebuffer;
|
||||
RenderBuffer renderbufferObject;
|
||||
Texture* ColourBuffer;
|
||||
Skybox skybox;
|
||||
Shader shader;
|
||||
|
||||
Shader m_shader;
|
||||
|
||||
glm::mat4 model = glm::mat4(1.0f);
|
||||
glm::mat4 view;
|
||||
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)800 / (float)600, 0.1f, 100.0f);
|
||||
|
||||
glm::vec3 lightpos = glm::vec3(-0.2f, -1.0f, -0.3f);
|
||||
|
||||
std::vector<float> ScreenVertices = {
|
||||
|
@ -1,34 +0,0 @@
|
||||
#include "ScenePass.h"
|
||||
|
||||
void ScenePass::Render()
|
||||
{
|
||||
m_shader.use();
|
||||
m_shader.setVec3("cameraPos", camera.Position);
|
||||
|
||||
|
||||
glActiveTexture(GL_TEXTURE11);
|
||||
m_skybox.Bind(); // Segmentation Fault HERE!!
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
m_shader.setInt("skybox",11);
|
||||
|
||||
|
||||
m_shader.setMat4("model", model);
|
||||
m_shader.setMat4("view", camera.GetViewMatrix());
|
||||
m_shader.setMat4("projection", projection);
|
||||
|
||||
|
||||
m_scene.Draw(m_shader);
|
||||
|
||||
|
||||
m_skybox.Unbind();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ScenePass::SetSkybox(Skybox& skybox)
|
||||
{
|
||||
m_skybox = skybox;
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#pragma once
|
||||
#include "RenderPass.h"
|
||||
#include "../Primitives/Skybox.h"
|
||||
#include "../Primitives/shader.h"
|
||||
#include "../Primitives/camera.h"
|
||||
#include "../model.h"
|
||||
|
||||
class ScenePass : public RenderPass {
|
||||
|
||||
public:
|
||||
void Render() override;
|
||||
|
||||
ScenePass(Skybox& skybox, Model& scene, Camera& camera, glm::mat4 projection , glm::mat4 model)
|
||||
: RenderPass("RenderPass - Scene", "../Shaders/shader.vs", "../Shaders/shader.fs" ),
|
||||
m_scene(scene), camera(camera), projection(projection), model(model), m_skybox(skybox)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
~ScenePass() = default;
|
||||
|
||||
void SetSkybox(Skybox& skybox);
|
||||
|
||||
private:
|
||||
Skybox& m_skybox;
|
||||
Model& m_scene;
|
||||
Camera& camera;
|
||||
|
||||
glm::mat4 projection;
|
||||
glm::mat4 model;
|
||||
|
||||
|
||||
};
|
@ -1,32 +0,0 @@
|
||||
#include "SkyboxPass.h"
|
||||
SkyboxPass::SkyboxPass(Skybox& skybox, Camera& camera, glm::mat4& projection) : RenderPass("Render Pass - Skybox", "../Shaders/skybox.vs", "../Shaders/Cubemap.fs"),
|
||||
skybox(skybox),
|
||||
camera(camera),
|
||||
projection(projection)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SkyboxPass::Render()
|
||||
{
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
m_shader.use();
|
||||
|
||||
m_shader.setMat4("projection", projection);
|
||||
glm::mat4 centeredView = glm::mat4(glm::mat3(camera.GetViewMatrix()));
|
||||
m_shader.setMat4("view", centeredView);
|
||||
|
||||
|
||||
|
||||
skybox.Bind();
|
||||
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
|
||||
skybox.Unbind();
|
||||
|
||||
glDepthMask(GL_TRUE);
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
#pragma once
|
||||
#include "RenderPass.h"
|
||||
#include "../Primitives/Skybox.h"
|
||||
#include "../Primitives/shader.h"
|
||||
#include "../Primitives/camera.h"
|
||||
|
||||
class SkyboxPass : public RenderPass {
|
||||
public:
|
||||
void Render() override;
|
||||
|
||||
SkyboxPass( Skybox& skybox, Camera& camera, glm::mat4& projection);
|
||||
~SkyboxPass() = default;
|
||||
|
||||
private:
|
||||
Skybox& skybox;
|
||||
Camera& camera;
|
||||
glm::mat4& projection;
|
||||
|
||||
|
||||
};
|
Reference in New Issue
Block a user