Clean up Renderer class.

master
Nicole Collings 2019-09-25 23:30:42 -07:00
parent 4c00f88963
commit 2bea0a34c6
18 changed files with 330 additions and 316 deletions

View File

@ -15,10 +15,9 @@ uniform sampler2D ssaoSampler;
uniform vec3 camPosition;
void main() {
// vec3 fragPos = texture(gPosition, texCoords).rgb;
vec3 normal = texture(gNormal, texCoords).rgb;
vec3 color = texture(gColorSpec, texCoords).rgb;
float ssao = texture(ssaoSampler, texCoords).r;
vec3 normal = texture(gNormal, texCoords).rgb;
vec3 color = texture(gColorSpec, texCoords).rgb;
float ssao = texture(ssaoSampler, texCoords).r;
//Discard fragments without normals
if (normal == vec3(0)) discard;

View File

@ -1,14 +0,0 @@
#version 330 core
//Just translate the coordinates directly into screen space.
//For rendering the framebuffer onto a quad.
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoords;
out vec2 texCoords;
void main() {
texCoords = aTexCoords;
gl_Position = vec4(aPos, 1.0);
}

View File

@ -140,12 +140,9 @@ set(ZEPHA_SRC
lua/Callback.h
lua/api/modules/cRegisterBlock.h
lua/api/modules/cDelay.h
game/graph/shader/uniform/WorldGeometryUniforms.h
game/graph/shader/uniform/GuiUniforms.h
game/graph/shader/uniform/WorldLightingUniforms.h
game/graph/meshtypes/EntityMesh.cpp
game/graph/meshtypes/EntityMesh.h
game/graph/shader/uniform/EntityGeometryUniforms.h
lua/api/modules/cRegisterBlockmodel.h
lua/api/modules/cSetBlock.h
lua/api/modules/cGetBlock.h
@ -211,6 +208,6 @@ set(ZEPHA_SRC
lua/api/customization/pVec3.cpp
lua/api/customization/pVec3.h
StartGame.h
game/graph/shader/SSAOShader.cpp game/graph/shader/SSAOShader.h game/graph/shader/BlurShader.cpp game/graph/shader/BlurShader.h)
game/graph/shader/SSAOShader.cpp game/graph/shader/SSAOShader.h game/graph/shader/BlurShader.cpp game/graph/shader/BlurShader.h game/graph/shader/LightingShader.cpp game/graph/shader/LightingShader.h game/graph/shader/WorldGeometryShader.cpp game/graph/shader/WorldGeometryShader.h game/graph/shader/EntityGeometryShader.cpp game/graph/shader/EntityGeometryShader.h)
add_library (Zepha_Core ${ZEPHA_SRC})

View File

@ -28,8 +28,8 @@ void Camera::createMatrices() {
orthographicMatrix = glm::ortho(0.0f, bufferDimensions.x, bufferDimensions.y, 0.0f, 0.0f, 100.0f);
}
void Camera::changeWindowDimensions(float buffWidth, float buffHeight) {
this->bufferDimensions = glm::vec2(buffWidth, buffHeight);
void Camera::changeWindowDimensions(glm::vec2 size) {
this->bufferDimensions = size;
createMatrices();
}

View File

@ -15,7 +15,7 @@ public:
Camera();
void create(float buffWidth, float buffHeight, glm::vec3 up);
void changeWindowDimensions(float buffWidth, float buffHeight);
void changeWindowDimensions(glm::vec2 size);
glm::vec3 getPos();
void setPos(glm::vec3 pos);

View File

@ -9,124 +9,33 @@ Renderer::Renderer() : Renderer(1366, 768) {};
Renderer::Renderer(GLint winWidth, GLint winHeight) :
activeTexture(nullptr),
window(winWidth, winHeight),
swayData(new unsigned char[16 * 4 * 16]),
ssao({winWidth, winHeight}, 1, 32),
blur({winWidth, winHeight}, 1) {
world({winWidth, winHeight}, 2),
entity({winWidth, winHeight}, 2),
ssao({winWidth, winHeight}, 1, 16),
blur({winWidth, winHeight}, 1),
lighting({winWidth, winHeight}, 2) {
window.initialize();
auto winSize = window.getSize();
camera.create(winSize.x, winSize.y, glm::vec3(0, 1, 0));
for (int i = 0; i < 16 * 16; i++) {
swayData[i*4+1] = 127;
swayData[i*4+3] = 255;
}
swayNoise.SetFrequency(0.5);
swayNoise.SetOctaveCount(2);
swayTex.loadFromBytes(swayData, 16, 16, GL_LINEAR, GL_MIRRORED_REPEAT);
camera.create(window.getSize().x, window.getSize().y, glm::vec3(0, 1, 0));
ssao.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/ssaoCalc.fs");
blur.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/ssaoBlur.fs");
lighting.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/deferredLighting.fs");
world.createFromFile("./assets/shader/world/deferredGeometryWorld.vs", "./assets/shader/world/deferredGeometryWorld.fs");
entity.createFromFile("./assets/shader/world/deferredGeometryEntity.vs", "./assets/shader/world/deferredGeometryEntity.fs");
createWorldShaders();
createGUIShader();
guiShader = Shader();
guiShader.createFromFile("./assets/shader/ortho/hud.vs", "./assets/shader/ortho/hud.fs");
gu.matrix = camera.getOrthographicMatrix();
gu.ortho = guiShader.get("ortho");
gu.model = guiShader.get("model");
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_CULL_FACE);
}
void Renderer::createWorldShaders() {
//Initialize World Geometry Shader
worldGeometryShader = Shader();
worldGeometryShader.createFromFile("./assets/shader/world/deferredGeometryWorld.vs", "./assets/shader/world/deferredGeometryWorld.fs");
wgu.matrix = camera.getProjectionMatrix();
wgu.proj = worldGeometryShader.get("projection");
wgu.model = worldGeometryShader.get("model");
wgu.view = worldGeometryShader.get("view");
wgu.swaySampler = worldGeometryShader.get("swayTex");
wgu.time = worldGeometryShader.get("time");
worldGeometryShader.use();
worldGeometryShader.set(wgu.swaySampler, 1);
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
auto winSize = window.getSize();
winSize *= renderScale;
glGenTextures(1, &gPosition);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);
glGenTextures(1, &gNormal);
glBindTexture(GL_TEXTURE_2D, gNormal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gNormal, 0);
glGenTextures(1, &gColorSpec);
glBindTexture(GL_TEXTURE_2D, gColorSpec);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
unsigned int attachments[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, attachments);
glGenRenderbuffers(1, &rboDepth);
glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, static_cast<int>(winSize.x), static_cast<int>(winSize.y));
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << "Framebuffer not complete!" << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//Initialize Entity Geometry Shader
entityGeometryShader = Shader();
entityGeometryShader.createFromFile("./assets/shader/world/deferredGeometryEntity.vs", "./assets/shader/world/deferredGeometryEntity.fs");
egu.matrix = camera.getProjectionMatrix();
egu.proj = entityGeometryShader.get("projection");
egu.model = entityGeometryShader.get("model");
egu.view = entityGeometryShader.get("view");
egu.uBones = entityGeometryShader.get("uBones");
//Initialize Lighting Shader for Deferred Rendering
worldLightingShader = Shader();
worldLightingShader.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/deferredLighting.fs");
wlu.gPosition = worldLightingShader.get("gPosition");
wlu.gNormal = worldLightingShader.get("gNormal");
wlu.gColorSpec = worldLightingShader.get("gColorSpec");
wlu.camPosition = worldLightingShader.get("camPosition");
worldLightingShader.use();
worldLightingShader.set(wlu.gPosition, 0);
worldLightingShader.set(wlu.gNormal, 1);
worldLightingShader.set(wlu.gColorSpec, 2);
//Initialize Shading Shader for Shadowmapping
// const unsigned int SHADOW_SCALE = 2048;
@ -143,124 +52,59 @@ void Renderer::createWorldShaders() {
// glDrawBuffer(GL_NONE);
// glReadBuffer(GL_NONE);
// glBindBuffer(GL_FRAMEBUFFER, 0);
}
void Renderer::createGUIShader() {
guiShader = Shader();
guiShader.createFromFile("./assets/shader/ortho/hud.vs", "./assets/shader/ortho/hud.fs");
gu.matrix = camera.getOrthographicMatrix();
gu.ortho = guiShader.get("ortho");
gu.model = guiShader.get("model");
}
void Renderer::update(double delta) {
//VSync 1 = On, 0 = Off
glfwSwapInterval(1);
window.update();
elapsedTime += delta;
swayOffset += delta * 1.4;
for (int i = 0; i < 16 * 16; i++) {
swayData[i*4] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset))) + 1) / 2.f * 255.f);
swayData[i*4+1] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset + 50))) + 1) / 2.f * 255.f);
swayData[i*4+2] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset + 100))) + 1) / 2.f * 255.f);
}
swayTex.updateTexture(0, 0, 16, 16, swayData);
window.update();
world.updateSwayMap(delta);
if (window.resized) {
ssao.windowResized(window.getSize());
blur.windowResized(window.getSize());
lighting.windowResized(window.getSize());
world.windowResized(window.getSize());
resized = true;
window.resized = false;
camera.changeWindowDimensions(window.getSize());
auto winSize = window.getSize();
camera.changeWindowDimensions(winSize.x, winSize.y);
winSize *= renderScale;
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGB, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);
glBindTexture(GL_TEXTURE_2D, gNormal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGB, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gNormal, 0);
glBindTexture(GL_TEXTURE_2D, gColorSpec);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<int>(winSize.x), static_cast<int>(winSize.y), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
unsigned int attachments[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, attachments);
glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, static_cast<int>(winSize.x), static_cast<int>(winSize.y));
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << "Framebuffer not complete!" << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//
// glBindTexture(GL_TEXTURE_2D, ssao.colorBuffer);
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, static_cast<int>(winSize.x / 2), static_cast<int>(winSize.y / 2), 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
//
// glBindTexture(GL_TEXTURE_2D, blur.colorBuffer);
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, static_cast<int>(winSize.x / 2), static_cast<int>(winSize.y / 2), 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
wgu.matrix = camera.getProjectionMatrix();
egu.matrix = camera.getProjectionMatrix();
gu.matrix = camera.getOrthographicMatrix();
}
}
void Renderer::beginChunkDeferredCalls() {
activeTexture = nullptr;
currentModelUniform = wgu.model;
currentModelUniform = world.uniforms.model;
auto winSize = window.getSize();
winSize *= renderScale;
glClearColor(clearColor.x, clearColor.y, clearColor.z, 0);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glViewport(0, 0, static_cast<int>(winSize.x), static_cast<int>(winSize.y));
glViewport(0, 0, static_cast<int>(world.windowSize.x * world.bufferScale), static_cast<int>(world.windowSize.y * world.bufferScale));
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
worldGeometryShader.use();
worldGeometryShader.set(wgu.proj, wgu.matrix);
worldGeometryShader.set(wgu.view, camera.getViewMatrix());
worldGeometryShader.set(wgu.time, static_cast<float>(elapsedTime));
swayTex.use(1);
world.use();
world.set(world.uniforms.proj, camera.getProjectionMatrix());
world.set(world.uniforms.view, camera.getViewMatrix());
world.set(world.uniforms.time, static_cast<float>(elapsedTime));
world.swayTex.use(1);
}
void Renderer::beginEntityDeferredCalls() {
currentModelUniform = egu.model;
currentModelUniform = entity.uniforms.model;
entityGeometryShader.use();
entityGeometryShader.set(egu.proj, egu.matrix);
entityGeometryShader.set(egu.view, camera.getViewMatrix());
entity.use();
entity.set(entity.uniforms.proj, camera.getProjectionMatrix());
entity.set(entity.uniforms.view, camera.getViewMatrix());
}
void Renderer::endDeferredCalls() {
activeTexture = nullptr;
glBindFramebuffer(GL_FRAMEBUFFER, ssao.fbo);
glClearColor(0, 0, 0, 0);
glClearColor(clearColor.x, clearColor.y, clearColor.z, 0);
glClear(GL_COLOR_BUFFER_BIT);
ssao.use();
@ -269,13 +113,14 @@ void Renderer::endDeferredCalls() {
ssao.set(ssao.uniforms.kernelCount, ssao.kernelCount);
for (unsigned int i = 0; i < ssao.kernelCount; i++) {
ssao.set(ssao.get("samples[" + std::to_string(i) + "]"), ssao.kernels[i]);
GLint uni = ssao.get("samples[" + std::to_string(i) + "]");
ssao.set(uni, ssao.kernels[i]);
}
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, gPosition);
glBindTexture(GL_TEXTURE_2D, lighting.gPosition);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, gNormal);
glBindTexture(GL_TEXTURE_2D, lighting.gNormal);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, ssao.tex);
@ -296,16 +141,15 @@ void Renderer::endDeferredCalls() {
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
worldLightingShader.use();
worldLightingShader.set(wlu.camPosition, camera.getPos());
lighting.use();
lighting.set(lighting.uniforms.camPosition, camera.getPos());
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, blur.colorBuffer);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, gNormal);
glBindTexture(GL_TEXTURE_2D, lighting.gNormal);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, gColorSpec);
glBindTexture(GL_TEXTURE_2D, lighting.gColorSpec);
glEnable(GL_BLEND);
renderQuad();
@ -382,18 +226,11 @@ void Renderer::enableTexture(Texture *texture) {
}
}
Renderer::~Renderer() {
worldGeometryShader.cleanup();
guiShader.cleanup();
swayTex.clear();
delete[] swayData;
}
void Renderer::setClearColor(unsigned char r, unsigned char g, unsigned char b) {
clearColor = {static_cast<float>(r)/255.f, static_cast<float>(g)/255.f, static_cast<float>(b)/255.f, 1};
}
void Renderer::setBones(std::vector<glm::mat4> &transforms) {
if (transforms.empty()) return;
entityGeometryShader.setArr(egu.uBones, static_cast<GLsizei>(transforms.size()), transforms.at(0));
entity.setArr(entity.uniforms.bones, static_cast<GLsizei>(transforms.size()), transforms.at(0));
}

View File

@ -4,28 +4,25 @@
#pragma once
#include "meshtypes/ChunkMesh.h"
#include <glm/ext.hpp>
#include <noise/noise.h>
#include "Camera.h"
#include "Texture.h"
#include "window/Window.h"
#include "shader/Shader.h"
#include "shader/SSAOShader.h"
#include "shader/BlurShader.h"
#include "window/Window.h"
#include "Camera.h"
#include "Texture.h"
#include "shader/LightingShader.h"
#include "shader/WorldGeometryShader.h"
#include "shader/EntityGeometryShader.h"
#include "shader/uniform/GuiUniforms.h"
#include "shader/uniform/WorldLightingUniforms.h"
#include "shader/uniform/WorldGeometryUniforms.h"
#include "shader/uniform/EntityGeometryUniforms.h"
#include <glm/ext.hpp>
#include <noise/noise.h>
#include "meshtypes/ChunkMesh.h"
class Renderer {
public:
Renderer();
Renderer(GLint winWidth, GLint winHeight);
void createWorldShaders();
void createGUIShader();
void update(double delta);
void beginChunkDeferredCalls();
@ -43,37 +40,26 @@ public:
Window& getWindow();
Camera& getCamera();
~Renderer();
bool resized;
private:
void renderQuad();
unsigned int quadVAO = 0, quadVBO;
float renderScale = 2.0f;
Window window;
Camera camera;
unsigned int gBuffer, gPosition, gNormal, gColorSpec, rboDepth;
unsigned int sBuffer, sDepthMap;
Texture swayTex;
double swayOffset = 0;
noise::module::Perlin swayNoise;
unsigned char* swayData = nullptr;
glm::vec4 clearColor {0, 0, 0, 1};
Texture* activeTexture;
Shader worldGeometryShader;
WorldGeometryUniforms wgu;
Shader entityGeometryShader;
EntityGeometryUniforms egu;
WorldGeometryShader world;
EntityGeometryShader entity;
SSAOShader ssao;
BlurShader blur;
Shader worldLightingShader;
WorldLightingUniforms wlu;
LightingShader lighting;
Shader guiShader;
GuiUniforms gu;

View File

@ -27,6 +27,8 @@ void BlurShader::postCreate() {
}
void BlurShader::windowResized(glm::vec2 windowSize) {
this->windowSize = windowSize;
glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);

View File

@ -0,0 +1,19 @@
//
// Created by aurailus on 25/09/19.
//
#include "EntityGeometryShader.h"
EntityGeometryShader::EntityGeometryShader(glm::vec2 windowSize, float bufferScale) : Shader(),
windowSize(windowSize),
bufferScale(bufferScale) {}
void EntityGeometryShader::postCreate() {
uniforms.proj = get("projection");
uniforms.model = get("model");
uniforms.view = get("view");
uniforms.bones = get("uBones");
}

View File

@ -0,0 +1,27 @@
//
// Created by aurailus on 25/09/19.
//
#pragma once
#include "Shader.h"
class EntityGeometryShader : public Shader {
public:
explicit EntityGeometryShader(glm::vec2 windowSize, float bufferScale);
void postCreate() override;
struct Uniforms {
GLint proj;
GLint model;
GLint view;
GLint bones;
};
Uniforms uniforms {};
private:
glm::vec2 windowSize {};
float bufferScale = 1;
};

View File

@ -0,0 +1,97 @@
//
// Created by aurailus on 24/09/19.
//
#include "LightingShader.h"
LightingShader::LightingShader(glm::vec2 windowSize, float bufferScale) : Shader(),
windowSize(windowSize),
bufferScale(bufferScale) {}
void LightingShader::postCreate() {
uniforms.gPosition = get("gPosition");
uniforms.gNormal = get("gNormal");
uniforms.gColorSpec = get("gColorSpec");
uniforms.camPosition = get("camPosition");
use();
set(uniforms.gPosition, 0);
set(uniforms.gNormal, 1);
set(uniforms.gColorSpec, 2);
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glGenTextures(1, &gPosition);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);
glGenTextures(1, &gNormal);
glBindTexture(GL_TEXTURE_2D, gNormal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gNormal, 0);
glGenTextures(1, &gColorSpec);
glBindTexture(GL_TEXTURE_2D, gColorSpec);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<int>(windowSize.x), static_cast<int>(windowSize.y), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
unsigned int attachments[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, attachments);
glGenRenderbuffers(1, &rDepth);
glBindRenderbuffer(GL_RENDERBUFFER, rDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale));
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rDepth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << Log::err << "-- Lighting framebuffer incomplete! --" << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void LightingShader::windowResized(glm::vec2 windowSize) {
this->windowSize = windowSize;
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);
glBindTexture(GL_TEXTURE_2D, gNormal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gNormal, 0);
glBindTexture(GL_TEXTURE_2D, gColorSpec);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gColorSpec, 0);
unsigned int attachments[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, attachments);
glBindRenderbuffer(GL_RENDERBUFFER, rDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale));
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rDepth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << Log::err << "-- Lighting framebuffer incomplete! --" << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

View File

@ -0,0 +1,35 @@
//
// Created by aurailus on 24/09/19.
//
#pragma once
#include "Shader.h"
class LightingShader : public Shader {
public:
explicit LightingShader(glm::vec2 windowSize, float bufferScale);
void postCreate() override;
void windowResized(glm::vec2 windowSize);
struct Uniforms {
GLint gPosition;
GLint gNormal;
GLint gColorSpec;
GLint camPosition;
};
Uniforms uniforms {};
uint gBuffer;
uint gPosition;
uint gNormal;
uint gColorSpec;
uint rDepth;
private:
glm::vec2 windowSize {};
float bufferScale = 1;
};

View File

@ -68,6 +68,8 @@ void SSAOShader::postCreate() {
}
void SSAOShader::windowResized(glm::vec2 windowSize) {
this->windowSize = windowSize;
glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, static_cast<int>(windowSize.x * bufferScale), static_cast<int>(windowSize.y * bufferScale), 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);

View File

@ -0,0 +1,46 @@
//
// Created by aurailus on 25/09/19.
//
#include "WorldGeometryShader.h"
WorldGeometryShader::WorldGeometryShader(glm::vec2 windowSize, float bufferScale) : Shader(),
windowSize(windowSize),
bufferScale(bufferScale),
swayData(new unsigned char[16 * 4 * 16]) {
swayNoise.SetFrequency(0.5);
swayNoise.SetOctaveCount(2);
}
void WorldGeometryShader::postCreate() {
swayTex.loadFromBytes(swayData, 16, 16, GL_LINEAR, GL_MIRRORED_REPEAT);
uniforms.proj = get("projection");
uniforms.model = get("model");
uniforms.view = get("view");
uniforms.swaySampler = get("swayTex");
uniforms.time = get("time");
use();
set(uniforms.swaySampler, 1);
}
void WorldGeometryShader::windowResized(glm::vec2 windowSize) {
this->windowSize = windowSize;
}
void WorldGeometryShader::updateSwayMap(double delta) {
swayOffset += delta * 1.4;
for (int i = 0; i < 16 * 16; i++) {
swayData[i*4] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset))) + 1) / 2.f * 255.f);
swayData[i*4+1] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset + 50))) + 1) / 2.f * 255.f);
swayData[i*4+2] = static_cast<unsigned char>((fmax(-1, fmin(1, swayNoise.GetValue((i / 16) / 3.f, (i % 16) / 3.f, swayOffset + 100))) + 1) / 2.f * 255.f);
}
swayTex.updateTexture(0, 0, 16, 16, swayData);
}
WorldGeometryShader::~WorldGeometryShader() {
swayTex.clear();
delete[] swayData;
}

View File

@ -0,0 +1,40 @@
//
// Created by aurailus on 25/09/19.
//
#pragma once
#include <noise/noise.h>
#include "Shader.h"
#include "../Texture.h"
class WorldGeometryShader : public Shader {
public:
explicit WorldGeometryShader(glm::vec2 windowSize, float bufferScale);
void postCreate() override;
void windowResized(glm::vec2 windowSize);
void updateSwayMap(double delta);
~WorldGeometryShader();
struct Uniforms {
GLint proj;
GLint model;
GLint view;
GLint swaySampler;
GLint time;
};
Uniforms uniforms {};
Texture swayTex;
double swayOffset = 0;
noise::module::Perlin swayNoise;
unsigned char* swayData = nullptr;
glm::vec2 windowSize {};
float bufferScale = 1;
};

View File

@ -1,19 +0,0 @@
//
// Created by aurailus on 18/06/19.
//
#pragma once
#include <GL/gl.h>
#include <glm/mat4x4.hpp>
struct EntityGeometryUniforms {
glm::mat4 matrix;
GLint proj;
GLint model;
GLint view;
GLint uBones;
};

View File

@ -1,22 +0,0 @@
//
// Created by aurailus on 16/06/19.
//
#pragma once
#include <GL/gl.h>
#include <glm/mat4x4.hpp>
struct WorldGeometryUniforms {
glm::mat4 matrix;
GLint proj;
GLint model;
GLint view;
GLint swaySampler;
GLint time;
};

View File

@ -1,18 +0,0 @@
//
// Created by aurailus on 17/06/19.
//
#pragma once
#include <GL/gl.h>
#include <glm/mat4x4.hpp>
struct WorldLightingUniforms {
GLint gPosition;
GLint gNormal;
GLint gColorSpec;
GLint camPosition;
};