Architecture redesign
PART 1: - Added a Renderer class - Added a Application interface - Added a RenderPass interface - Added multiple RenderPass classes - Added a Window class - Moved Shaders into a Shader folder The idea behind this redesign is to make more abstractions. These abstraction are then supposedly going to make it easier to focus on the next couple tutorials main elements
This commit is contained in:
parent
71c942d88e
commit
4355a12b9a
6
src/Application.h
Normal file
6
src/Application.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
class Application
|
||||
{
|
||||
virtual void Run() = 0;
|
||||
};
|
@ -1,10 +1,12 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include "stb_image.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "stb_image.h"
|
||||
|
||||
|
||||
class Cubemap {
|
||||
public:
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "FrameBuffer.hpp"
|
||||
#include "FrameBuffer.h"
|
||||
|
||||
|
||||
void FrameBuffer::Bind()
|
||||
|
@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include "texture.h"
|
||||
#include "RenderBuffer.hpp"
|
||||
#include "RenderBuffer.h"
|
||||
|
||||
|
||||
class FrameBuffer
|
58
src/OutlinePass.cpp
Normal file
58
src/OutlinePass.cpp
Normal file
@ -0,0 +1,58 @@
|
||||
#include "OutlinePass.h"
|
||||
#include "Renderer.h"
|
||||
OutlinePass::OutlinePass(Shader& shader, Model& sceneObject, glm::mat4& model, glm::mat4& projection, Camera& camera)
|
||||
: RenderPass("Renderpass - Outline", shader ) , m_model(sceneObject), model(model), projection(projection), camera(camera)
|
||||
{
|
||||
}
|
||||
|
||||
OutlinePass::~OutlinePass(){
|
||||
|
||||
delete m_depthTexture;
|
||||
}
|
||||
|
||||
void OutlinePass::Setup()
|
||||
{
|
||||
// Framebuffer outline effect
|
||||
m_outlineFrameBuffer = FrameBuffer();
|
||||
m_outlineFrameBuffer.Bind();
|
||||
|
||||
// Create a texture attachment (colour attachment)
|
||||
m_depthTexture = CreateTexture(800,600);
|
||||
|
||||
// attach texture to the frame buffer as a colour attachment
|
||||
m_outlineFrameBuffer.Attach(*m_depthTexture);
|
||||
|
||||
// Add depth buffer attachment
|
||||
m_outlineRenderBuffer = RenderBuffer();
|
||||
m_outlineRenderBuffer.Bind();
|
||||
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
|
||||
m_outlineRenderBuffer.Unbind();
|
||||
|
||||
// attach depth buffer to our framebuffer
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_outlineRenderBuffer.id);
|
||||
m_outlineFrameBuffer.Unbind();
|
||||
|
||||
}
|
||||
|
||||
void OutlinePass::Render()
|
||||
{
|
||||
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);
|
||||
|
||||
m_model.Draw(m_shader);
|
||||
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xff);
|
||||
glStencilMask(0xFF);
|
||||
|
||||
}
|
30
src/OutlinePass.h
Normal file
30
src/OutlinePass.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
#include <glm/glm.hpp>
|
||||
#include "RenderPass.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "texture.h"
|
||||
#include "model.h"
|
||||
#include "camera.h"
|
||||
|
||||
class OutlinePass : RenderPass {
|
||||
|
||||
public:
|
||||
void Setup() override;
|
||||
void Render() override;
|
||||
|
||||
OutlinePass (Shader& shader, Model& sceneObject, glm::mat4& model , glm::mat4& projection, Camera& camera) ;
|
||||
~OutlinePass();
|
||||
|
||||
private:
|
||||
FrameBuffer m_outlineFrameBuffer;
|
||||
RenderBuffer m_outlineRenderBuffer;
|
||||
Texture* m_depthTexture;
|
||||
|
||||
glm::mat4 model;
|
||||
glm::mat4 projection;
|
||||
|
||||
Model& m_model;
|
||||
Camera& camera;
|
||||
|
||||
};
|
@ -1,4 +1,4 @@
|
||||
#include "RenderBuffer.hpp"
|
||||
#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!
|
||||
|
@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
class RenderBuffer
|
||||
{
|
||||
public:
|
16
src/RenderPass.h
Normal file
16
src/RenderPass.h
Normal file
@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include "shader.h"
|
||||
|
||||
class RenderPass {
|
||||
public :
|
||||
virtual void Render() = 0;
|
||||
virtual void Setup() = 0;
|
||||
|
||||
RenderPass(const std::string& name, Shader& shader) : m_name(name), m_shader(shader) {}
|
||||
~RenderPass(){}
|
||||
|
||||
protected:
|
||||
const std::string& m_name;
|
||||
Shader& m_shader;
|
||||
};
|
116
src/Renderer.cpp
Normal file
116
src/Renderer.cpp
Normal file
@ -0,0 +1,116 @@
|
||||
#include "Renderer.h"
|
||||
#include <iostream>
|
||||
|
||||
void Renderer::Setup()
|
||||
{
|
||||
framebuffer = new FrameBuffer();
|
||||
framebuffer->Bind();
|
||||
|
||||
ColourBuffer = CreateTexture(800,600);
|
||||
framebuffer->Attach(*ColourBuffer);
|
||||
|
||||
renderbufferObject = new RenderBuffer();
|
||||
renderbufferObject->Bind();
|
||||
renderbufferObject->UseDepthAndStencil();
|
||||
renderbufferObject->Unbind();
|
||||
|
||||
framebuffer->Attach(*renderbufferObject);
|
||||
|
||||
if(framebuffer->IsComplete() == false ){
|
||||
std::cout << "ERROR::FRAMEBUFFER::Framebuffer is not complete! " << std::endl;
|
||||
}
|
||||
|
||||
framebuffer->Unbind();
|
||||
}
|
||||
|
||||
void Renderer::Render()
|
||||
{
|
||||
float currentFrame = glfwGetTime();
|
||||
deltaTime = currentFrame - lastFrame;
|
||||
lastFrame = currentFrame;
|
||||
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
// Recalculate the Camera's view matrix
|
||||
view = camera.GetViewMatrix();
|
||||
// Reset the model matrix to an identity matrix
|
||||
model = glm::mat4(1.0f);
|
||||
|
||||
|
||||
framebuffer->Bind();
|
||||
std::cout << "Starting Render passes :" << std::endl;
|
||||
|
||||
// Outline of render steps
|
||||
|
||||
// 1. Skybox pass
|
||||
// 2. Scene pass
|
||||
// 3. outline pass
|
||||
// SKIP for now!
|
||||
|
||||
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);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
|
||||
m_shader->use();
|
||||
m_shader->setInt("screenTexture",0);
|
||||
glBindVertexArray(ScreenVAO);
|
||||
glBindTexture(GL_TEXTURE_2D, ColourBuffer->id);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
|
||||
|
||||
// Reset stencil
|
||||
glStencilMask(0xFF);
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Renderer::Renderer(Camera& camera)
|
||||
: camera(camera)
|
||||
{
|
||||
deltaTime = 0.0f;
|
||||
/// Create and compile the screen shader
|
||||
m_shader = new Shader ("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);
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
delete framebuffer;
|
||||
delete renderbufferObject;
|
||||
delete m_shader;
|
||||
delete ColourBuffer;
|
||||
}
|
60
src/Renderer.h
Normal file
60
src/Renderer.h
Normal file
@ -0,0 +1,60 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <stdio.h>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
#include "camera.h"
|
||||
#include "shader.h"
|
||||
#include "model.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "Cubemap.h"
|
||||
#include "SkyboxPass.h"
|
||||
#include "ScenePass.h"
|
||||
|
||||
class Renderer
|
||||
{
|
||||
public:
|
||||
void Render();
|
||||
void Setup();
|
||||
|
||||
Renderer(Camera& camera);
|
||||
~Renderer();
|
||||
|
||||
private:
|
||||
Camera& camera;
|
||||
float deltaTime; // Time between current frame and last frame
|
||||
float lastFrame = 0.0f; // Time of last frame
|
||||
GLuint ScreenVAO, VBO;
|
||||
FrameBuffer* framebuffer;
|
||||
RenderBuffer* renderbufferObject;
|
||||
Texture* ColourBuffer;
|
||||
|
||||
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 = {
|
||||
// vertex , uv
|
||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
||||
-1.0f,-1.0f, 0.0f, 0.0f,
|
||||
1.0f, -1.0f, 1.0f, 0.0f,
|
||||
|
||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f, 0.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
};
|
||||
|
||||
|
||||
|
||||
};
|
32
src/ScenePass.cpp
Normal file
32
src/ScenePass.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include "ScenePass.h"
|
||||
|
||||
void ScenePass::Render()
|
||||
{
|
||||
m_shader.use();
|
||||
m_shader.setVec3("cameraPos", camera.Position);
|
||||
|
||||
if (m_skybox)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE11);
|
||||
m_skybox->Bind();
|
||||
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);
|
||||
}
|
||||
|
||||
void ScenePass::Setup()
|
||||
{
|
||||
}
|
||||
|
||||
void ScenePass::SetSkybox(Skybox& skybox)
|
||||
{
|
||||
m_skybox = &skybox;
|
||||
}
|
28
src/ScenePass.h
Normal file
28
src/ScenePass.h
Normal file
@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
#include "RenderPass.h"
|
||||
#include "Renderer.h"
|
||||
#include "Skybox.h"
|
||||
#include "shader.h"
|
||||
#include "camera.h"
|
||||
#include "model.h"
|
||||
class ScenePass : RenderPass {
|
||||
|
||||
public:
|
||||
void Setup() override;
|
||||
void Render() override;
|
||||
|
||||
ScenePass(Shader& shader, Model& scene, glm::mat4& model, glm::mat4& projection, Camera& camera)
|
||||
: RenderPass("RenderPass - Scene", shader), m_scene(scene), model(model), projection(projection), camera(camera) {}
|
||||
~ScenePass();
|
||||
|
||||
void SetSkybox(Skybox& skybox);
|
||||
|
||||
private:
|
||||
Skybox* m_skybox;
|
||||
Model& m_scene;
|
||||
glm::mat4& model;
|
||||
glm::mat4& projection;
|
||||
Camera& camera;
|
||||
|
||||
|
||||
};
|
25
src/Skybox.cpp
Normal file
25
src/Skybox.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
#include "Skybox.h"
|
||||
|
||||
void Skybox::BuildVAO(){
|
||||
// Create SkyboxVAO
|
||||
|
||||
glGenVertexArrays(1, &m_skyboxVAO);
|
||||
glBindVertexArray(m_skyboxVAO);
|
||||
|
||||
glGenBuffers(1, &m_skyboxVBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_skyboxVBO);
|
||||
|
||||
glBufferData(GL_ARRAY_BUFFER, m_skyboxVertices.size() * sizeof(float), &m_skyboxVertices[0], GL_STATIC_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0,3, GL_FLOAT,GL_FALSE, 3 * sizeof(float),(void*) 0);
|
||||
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
Skybox::Skybox() : Cubemap()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Skybox::~Skybox(){}
|
59
src/Skybox.h
Normal file
59
src/Skybox.h
Normal file
@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include "Cubemap.h"
|
||||
|
||||
|
||||
class Skybox : public Cubemap {
|
||||
public:
|
||||
Skybox ();
|
||||
~Skybox ();
|
||||
|
||||
void BuildVAO();
|
||||
GLuint m_skyboxVAO;
|
||||
private:
|
||||
GLuint m_skyboxVBO;
|
||||
std::vector<float> m_skyboxVertices = {
|
||||
// positions
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f
|
||||
};
|
||||
};
|
26
src/SkyboxPass.cpp
Normal file
26
src/SkyboxPass.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
#include "SkyboxPass.h"
|
||||
|
||||
|
||||
SkyboxPass::~SkyboxPass()
|
||||
{
|
||||
}
|
||||
|
||||
void SkyboxPass::Setup()
|
||||
{
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
glBindVertexArray(skybox.m_skyboxVAO);
|
||||
skybox.Bind();
|
||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
glDepthMask(GL_TRUE);
|
||||
}
|
21
src/SkyboxPass.h
Normal file
21
src/SkyboxPass.h
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
#include "RenderPass.h"
|
||||
#include "Renderer.h"
|
||||
#include "Skybox.h"
|
||||
#include "shader.h"
|
||||
|
||||
class SkyboxPass : RenderPass {
|
||||
public:
|
||||
void Render() override;
|
||||
void Setup() override;
|
||||
|
||||
SkyboxPass(Shader& shader, glm::mat4& projection, Skybox& skybox, Camera& camera)
|
||||
: RenderPass("Render Pass - Skybox", shader), projection(projection), skybox(skybox), camera(camera){}
|
||||
~SkyboxPass();
|
||||
|
||||
private:
|
||||
Skybox skybox;
|
||||
glm::mat4& projection;
|
||||
Camera& camera;
|
||||
|
||||
};
|
77
src/Window.cpp
Normal file
77
src/Window.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
#include "Window.h"
|
||||
|
||||
bool firstMouse = true;
|
||||
float lastx = 400, lasty = 300;
|
||||
|
||||
|
||||
Window::Window(int initialWidth, int initialHeight, const std::string& WindowName)
|
||||
: m_width(initialWidth), m_height(initialHeight), m_WindowName(WindowName)
|
||||
{
|
||||
glfwInit();
|
||||
|
||||
// setup the window
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
|
||||
// Enable window based multisampling
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
|
||||
m_window = glfwCreateWindow(m_width, m_height, m_WindowName.c_str(), NULL, NULL);
|
||||
|
||||
if(m_window == NULL)
|
||||
{
|
||||
printf("Failed to create GLFW window!\n");
|
||||
glfwTerminate();
|
||||
return;
|
||||
}
|
||||
|
||||
glfwMakeContextCurrent(m_window);
|
||||
|
||||
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
|
||||
printf("Failed to initialize GLAD!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
glViewport(0,0, m_width, m_height);
|
||||
|
||||
// Setup Callbacks
|
||||
glfwSetFramebufferSizeCallback(m_window, framebuffer_size_callback);
|
||||
//glfwSetInputMode(m_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||
glfwSetCursorPosCallback(m_window, mouse_callback);
|
||||
glfwSetScrollCallback(m_window, scroll_callback);
|
||||
}
|
||||
|
||||
|
||||
Window::~Window()
|
||||
{
|
||||
glfwDestroyWindow(m_window);
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
|
||||
{
|
||||
if(firstMouse){
|
||||
lastx = xpos;
|
||||
lasty = ypos;
|
||||
firstMouse = false;
|
||||
}
|
||||
|
||||
float xoffset = xpos - lastx;
|
||||
float yoffset = ypos - lasty;
|
||||
|
||||
lastx = xpos;
|
||||
lasty - ypos;
|
||||
|
||||
// camera.ProcessMouseMovement(xoffset, yoffset);
|
||||
}
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||
{
|
||||
glViewport(0,0, width,height);
|
||||
}
|
||||
|
||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
||||
{
|
||||
// camera.ProcessMouseScroll(yoffset);
|
||||
}
|
32
src/Window.h
Normal file
32
src/Window.h
Normal file
@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
|
||||
class Window
|
||||
{
|
||||
public:
|
||||
Window (int initialWidth, int initialHeight, const std::string& WindowName);
|
||||
~Window();
|
||||
|
||||
void setWidth(int width){this->m_width = width;}
|
||||
void setHeight(int height){this->m_height = height;}
|
||||
|
||||
int getWidth(){return this->m_width;}
|
||||
int getHeight(){return this->m_height;}
|
||||
double getRatio(){return (this->m_width / this->m_height);}
|
||||
|
||||
bool shouldClose(){ return glfwWindowShouldClose(m_window);}
|
||||
//void GetInput(){ processInput(m_window);}
|
||||
void SwapBuffers(){ glfwSwapBuffers(m_window);}
|
||||
private:
|
||||
int m_width, m_height;
|
||||
const std::string& m_WindowName;
|
||||
GLFWwindow* m_window;
|
||||
};
|
||||
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
|
||||
void mouse_callback(GLFWwindow* window, double xpos, double ypos);
|
||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
|
@ -1,6 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
|
||||
|
430
src/main.cpp
430
src/main.cpp
@ -1,399 +1,87 @@
|
||||
#include <stdio.h>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include "Window.h"
|
||||
#include "Renderer.h"
|
||||
#include "Skybox.h"
|
||||
#include "shader.h"
|
||||
#include "camera.h"
|
||||
#include "model.h"
|
||||
#include "FrameBuffer.hpp"
|
||||
#include "RenderBuffer.hpp"
|
||||
#include "Cubemap.h"
|
||||
#include "Application.h"
|
||||
|
||||
// https://learnopengl.com/Advanced-OpenGL/Framebuffers
|
||||
class LearnOpenGL : Application
|
||||
{
|
||||
|
||||
public:
|
||||
void Run () override{
|
||||
// Create a window
|
||||
Window window(800,600, "LearnOpenGL");
|
||||
|
||||
float deltaTime = 0.0f; // Time between current frame and last frame
|
||||
float lastFrame = 0.0f; // Time of last frame
|
||||
Camera camera(glm::vec3(0.0f,0.0f,8.0f));
|
||||
|
||||
Renderer renderer = Renderer(camera);
|
||||
|
||||
renderer.Setup();
|
||||
|
||||
stbi_set_flip_vertically_on_load(true);
|
||||
|
||||
Camera camera(glm::vec3(0.0f, 0.0f, 8.0f));
|
||||
float lastX = 400, lastY = 300;
|
||||
bool firstMouse = true;
|
||||
// Load scene resources
|
||||
Shader shader ("Shaders/shader.vs", "Shaders/shader.fs");
|
||||
Shader outlineShader("Shaders/shader.vs","Shaders/outlineshader.fs");
|
||||
Shader skyboxShader("Shaders/skybox.vs", "Shaders/Cubemap.fs");
|
||||
|
||||
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(-0.2f, -1.0f, -0.3f);
|
||||
Model backpack("Models/backpack.obj");
|
||||
int bullshit = 0;
|
||||
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"
|
||||
};
|
||||
|
||||
std::vector<float> ScreenVertices = {
|
||||
// vertex , uv
|
||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
||||
-1.0f,-1.0f, 0.0f, 0.0f,
|
||||
1.0f, -1.0f, 1.0f, 0.0f,
|
||||
Skybox skybox= Skybox ();
|
||||
skybox.Bind();
|
||||
skybox.loadCubeTextures(faces);
|
||||
skybox.BuildVAO();
|
||||
|
||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f, 0.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
} ;
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
while(!window.shouldClose())
|
||||
{
|
||||
//window.GetInput();
|
||||
|
||||
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"
|
||||
renderer.Render();
|
||||
|
||||
window.SwapBuffers();
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<float> skyboxVertices = {
|
||||
// positions
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
1.0f, 1.0f, -1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f,
|
||||
-1.0f, 1.0f, 1.0f,
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
|
||||
-1.0f, -1.0f, -1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
1.0f, -1.0f, -1.0f,
|
||||
-1.0f, -1.0f, 1.0f,
|
||||
1.0f, -1.0f, 1.0f
|
||||
};
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
|
||||
glViewport(0,0, width, height);
|
||||
}
|
||||
/*
|
||||
|
||||
void processInput( GLFWwindow* window){
|
||||
if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
||||
glfwSetWindowShouldClose(window, true);
|
||||
|
||||
const float CameraSpeed = 2.5f * deltaTime;
|
||||
const float CameraSpeed = 2.5f * Renderer::deltaTime;
|
||||
if(glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
|
||||
camera.ProcessKeyboard(FORWARD, deltaTime);
|
||||
Renderer::camera.ProcessKeyboard(FORWARD, Renderer::deltaTime);
|
||||
if(glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
|
||||
camera.ProcessKeyboard(BACKWARD, deltaTime);
|
||||
Renderer::camera.ProcessKeyboard(BACKWARD, Renderer::deltaTime);
|
||||
if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
|
||||
camera.ProcessKeyboard(LEFT, deltaTime);
|
||||
Renderer::camera.ProcessKeyboard(LEFT, Renderer::deltaTime);
|
||||
if(glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
||||
camera.ProcessKeyboard(RIGHT,deltaTime);
|
||||
Renderer::camera.ProcessKeyboard(RIGHT,Renderer::deltaTime);
|
||||
}
|
||||
|
||||
void mouse_callback(GLFWwindow* window, double xpos, double ypos){
|
||||
if (firstMouse) // initially set to true
|
||||
{
|
||||
lastX = xpos;
|
||||
lastY = ypos;
|
||||
firstMouse = false;
|
||||
}
|
||||
float xoffset = xpos - lastX;
|
||||
float yoffset = lastY - ypos; // reversed since y-coordinates range from bottom to top
|
||||
|
||||
lastX = xpos;
|
||||
lastY = ypos;
|
||||
*/
|
||||
|
||||
camera.ProcessMouseMovement(xoffset,yoffset);
|
||||
}
|
||||
|
||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
||||
int main()
|
||||
{
|
||||
camera.ProcessMouseScroll(yoffset);
|
||||
}
|
||||
|
||||
GLFWwindow* CreateWindowWithOpenGLContext()
|
||||
{
|
||||
glfwInit();
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
|
||||
// multisampling
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
|
||||
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
|
||||
if( window == NULL){
|
||||
printf("Failed to create GLFW window!\n");
|
||||
glfwTerminate();
|
||||
return nullptr;
|
||||
}
|
||||
glfwMakeContextCurrent(window);
|
||||
|
||||
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
|
||||
printf("Failed to initialize GLAD!\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
glViewport(0,0, 800, 600);
|
||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||
glfwSetCursorPosCallback(window, mouse_callback);
|
||||
glfwSetScrollCallback(window, scroll_callback);
|
||||
|
||||
return window;
|
||||
|
||||
}
|
||||
|
||||
void Skybox_pass (GLuint& SkyboxVAO, Shader& skyboxShader, Cubemap& skycubemap)
|
||||
{
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
skyboxShader.use();
|
||||
skyboxShader.setMat4("projection", projection);
|
||||
|
||||
glm::mat4 centeredView = glm::mat4(glm::mat3(camera.GetViewMatrix()));
|
||||
skyboxShader.setMat4("view", centeredView);
|
||||
|
||||
glBindVertexArray(SkyboxVAO);
|
||||
skycubemap.Bind();
|
||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
glDepthMask(GL_TRUE);
|
||||
}
|
||||
|
||||
void drawScene_pass(Shader& shader, Model& Object, Cubemap& skybox)
|
||||
{
|
||||
shader.use();
|
||||
shader.setVec3("cameraPos", camera.Position);
|
||||
|
||||
glActiveTexture(GL_TEXTURE11);
|
||||
skybox.Bind();
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
|
||||
shader.setMat4("model", model);
|
||||
shader.setMat4("view", view);
|
||||
shader.setMat4("projection", projection);
|
||||
shader.setInt("skybox",11);
|
||||
|
||||
Object.Draw(shader);
|
||||
}
|
||||
|
||||
void outline_pass( Shader& shader, Model& Object)
|
||||
{
|
||||
|
||||
|
||||
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
|
||||
glStencilMask(0x00);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
shader.use();
|
||||
shader.setMat4("model", model);
|
||||
shader.setMat4("view", view);
|
||||
shader.setMat4("projection", projection);
|
||||
shader.setVec3("outlineColor", glm::vec3(0.28, 0.10, 0.26));
|
||||
|
||||
model = glm::scale(model, glm::vec3(1.05f,1.05f, 1.05f));
|
||||
shader.setMat4("model", model);
|
||||
|
||||
Object.Draw(shader);
|
||||
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xff);
|
||||
glStencilMask(0xFF);
|
||||
}
|
||||
|
||||
void DrawToScreen( GLuint& VAO, GLuint& ScreenTexture, Shader& shader)
|
||||
{
|
||||
// draw to screen
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
|
||||
shader.use();
|
||||
shader.setInt("screenTexture",0);
|
||||
glBindVertexArray(VAO);
|
||||
glBindTexture(GL_TEXTURE_2D, ScreenTexture);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
}
|
||||
|
||||
int main() {
|
||||
printf("Hello OpenGL!\n");
|
||||
|
||||
|
||||
// Setup OpenGL Context
|
||||
GLFWwindow* window = CreateWindowWithOpenGLContext();
|
||||
|
||||
if(window == nullptr)
|
||||
return -1;
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
stbi_set_flip_vertically_on_load(true);
|
||||
|
||||
// Load scene resources
|
||||
Shader shader ("shader.vs", "shader.fs");
|
||||
Shader outlineShader("shader.vs","outlineshader.fs");
|
||||
Shader framebufferShader("Framebuffers.vs", "Framebuffers.fs" );
|
||||
Shader skyboxShader("skybox.vs", "Cubemap.fs");
|
||||
|
||||
Model backpack("Models/backpack.obj");
|
||||
|
||||
// Framebuffer outline effect
|
||||
FrameBuffer outlineFrameBuffer = FrameBuffer();
|
||||
outlineFrameBuffer.Bind();
|
||||
|
||||
// Create a texture attachment (colour attachment)
|
||||
Texture* depthTexture = CreateTexture(800,600);
|
||||
|
||||
// attach texture to the frame buffer as a colour attachment
|
||||
outlineFrameBuffer.Attach(*depthTexture);
|
||||
|
||||
// Add depth buffer attachment
|
||||
RenderBuffer outlineRenderBuffer = RenderBuffer();
|
||||
outlineRenderBuffer.Bind();
|
||||
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
|
||||
outlineRenderBuffer.Unbind();
|
||||
|
||||
// attach depth buffer to our framebuffer
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, outlineRenderBuffer.id);
|
||||
outlineFrameBuffer.Unbind();
|
||||
|
||||
// Post processing
|
||||
FrameBuffer framebuffer = FrameBuffer();
|
||||
framebuffer.Bind();
|
||||
|
||||
Texture* ColourBuffer = CreateTexture(800,600);
|
||||
framebuffer.Attach(*ColourBuffer);
|
||||
|
||||
RenderBuffer renderbufferObject = RenderBuffer();
|
||||
renderbufferObject.Bind();
|
||||
renderbufferObject.UseDepthAndStencil();
|
||||
renderbufferObject.Unbind();
|
||||
|
||||
framebuffer.Attach(renderbufferObject);
|
||||
|
||||
if(framebuffer.IsComplete() == false ){
|
||||
std::cout << "ERROR::FRAMEBUFFER::Framebuffer is not complete! " << std::endl;
|
||||
}
|
||||
|
||||
framebuffer.Unbind();
|
||||
|
||||
Cubemap skybox= Cubemap ();
|
||||
skybox.Bind();
|
||||
skybox.loadCubeTextures(faces);
|
||||
|
||||
// Create ScreenVAO
|
||||
GLuint ScreenVAO, VBO;
|
||||
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);
|
||||
|
||||
// Create SkyboxVAO
|
||||
GLuint SkyboxVAO, SkyboxVBO;
|
||||
glGenVertexArrays(1, &SkyboxVAO);
|
||||
glBindVertexArray(SkyboxVAO);
|
||||
|
||||
glGenBuffers(1, &SkyboxVBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, SkyboxVBO);
|
||||
|
||||
glBufferData(GL_ARRAY_BUFFER, skyboxVertices.size() * sizeof(float), &skyboxVertices[0], GL_STATIC_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0,3, GL_FLOAT,GL_FALSE, 3 * sizeof(float),(void*) 0);
|
||||
|
||||
glBindVertexArray(0);
|
||||
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
while(!glfwWindowShouldClose(window))
|
||||
{
|
||||
float currentFrame = glfwGetTime();
|
||||
deltaTime = currentFrame - lastFrame;
|
||||
lastFrame = currentFrame;
|
||||
|
||||
processInput(window);
|
||||
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
// Recalculate the Camera's view matrix
|
||||
view = camera.GetViewMatrix();
|
||||
// Reset the model matrix to an identity matrix
|
||||
model = glm::mat4(1.0f);
|
||||
|
||||
|
||||
framebuffer.Bind();
|
||||
|
||||
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
Skybox_pass(SkyboxVAO, skyboxShader, skybox);
|
||||
|
||||
drawScene_pass(shader, backpack, skybox);
|
||||
|
||||
outline_pass(outlineShader, backpack);
|
||||
|
||||
DrawToScreen(ScreenVAO, ColourBuffer->id, framebufferShader);
|
||||
|
||||
// Reset stencil
|
||||
glStencilMask(0xFF);
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
LearnOpenGL().Run();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
delete ColourBuffer;
|
||||
delete depthTexture;
|
||||
glfwTerminate();
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
}
|
@ -2,7 +2,6 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
|
@ -25,7 +25,6 @@ Shader::Shader(const char* vertextPath, const char* fragmentPath)
|
||||
|
||||
vertexCode = vShaderStream.str();
|
||||
fragmentCode = fShaderStream.str();
|
||||
|
||||
|
||||
}
|
||||
catch(std::ifstream::failure e){
|
||||
@ -35,7 +34,6 @@ Shader::Shader(const char* vertextPath, const char* fragmentPath)
|
||||
const char* vShaderCode = vertexCode.c_str();
|
||||
const char* fShaderCode = fragmentCode.c_str();
|
||||
|
||||
|
||||
// Compile Shaders
|
||||
unsigned int vertex, fragment;
|
||||
int success;
|
||||
@ -86,13 +84,10 @@ Shader::Shader(const char* vertextPath, const char* fragmentPath)
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Shader::use(){
|
||||
glUseProgram(ID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Shader::setBool(const std::string &name, bool value) const{
|
||||
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int) value );
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <string>
|
||||
|
||||
struct Texture{
|
||||
GLuint id;
|
||||
@ -8,5 +9,4 @@ struct Texture{
|
||||
std::string path;
|
||||
};
|
||||
|
||||
|
||||
Texture* CreateTexture(unsigned int width, unsigned int height);
|
Loading…
Reference in New Issue
Block a user