Clean up Renderer class.
parent
4c00f88963
commit
2bea0a34c6
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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})
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
};
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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;
|
||||
};
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue