Clean up Renderer class.
parent
4c00f88963
commit
2bea0a34c6
|
@ -15,10 +15,9 @@ uniform sampler2D ssaoSampler;
|
||||||
uniform vec3 camPosition;
|
uniform vec3 camPosition;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
// vec3 fragPos = texture(gPosition, texCoords).rgb;
|
vec3 normal = texture(gNormal, texCoords).rgb;
|
||||||
vec3 normal = texture(gNormal, texCoords).rgb;
|
vec3 color = texture(gColorSpec, texCoords).rgb;
|
||||||
vec3 color = texture(gColorSpec, texCoords).rgb;
|
float ssao = texture(ssaoSampler, texCoords).r;
|
||||||
float ssao = texture(ssaoSampler, texCoords).r;
|
|
||||||
|
|
||||||
//Discard fragments without normals
|
//Discard fragments without normals
|
||||||
if (normal == vec3(0)) discard;
|
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/Callback.h
|
||||||
lua/api/modules/cRegisterBlock.h
|
lua/api/modules/cRegisterBlock.h
|
||||||
lua/api/modules/cDelay.h
|
lua/api/modules/cDelay.h
|
||||||
game/graph/shader/uniform/WorldGeometryUniforms.h
|
|
||||||
game/graph/shader/uniform/GuiUniforms.h
|
game/graph/shader/uniform/GuiUniforms.h
|
||||||
game/graph/shader/uniform/WorldLightingUniforms.h
|
|
||||||
game/graph/meshtypes/EntityMesh.cpp
|
game/graph/meshtypes/EntityMesh.cpp
|
||||||
game/graph/meshtypes/EntityMesh.h
|
game/graph/meshtypes/EntityMesh.h
|
||||||
game/graph/shader/uniform/EntityGeometryUniforms.h
|
|
||||||
lua/api/modules/cRegisterBlockmodel.h
|
lua/api/modules/cRegisterBlockmodel.h
|
||||||
lua/api/modules/cSetBlock.h
|
lua/api/modules/cSetBlock.h
|
||||||
lua/api/modules/cGetBlock.h
|
lua/api/modules/cGetBlock.h
|
||||||
|
@ -211,6 +208,6 @@ set(ZEPHA_SRC
|
||||||
lua/api/customization/pVec3.cpp
|
lua/api/customization/pVec3.cpp
|
||||||
lua/api/customization/pVec3.h
|
lua/api/customization/pVec3.h
|
||||||
StartGame.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})
|
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);
|
orthographicMatrix = glm::ortho(0.0f, bufferDimensions.x, bufferDimensions.y, 0.0f, 0.0f, 100.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::changeWindowDimensions(float buffWidth, float buffHeight) {
|
void Camera::changeWindowDimensions(glm::vec2 size) {
|
||||||
this->bufferDimensions = glm::vec2(buffWidth, buffHeight);
|
this->bufferDimensions = size;
|
||||||
createMatrices();
|
createMatrices();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ public:
|
||||||
Camera();
|
Camera();
|
||||||
void create(float buffWidth, float buffHeight, glm::vec3 up);
|
void create(float buffWidth, float buffHeight, glm::vec3 up);
|
||||||
|
|
||||||
void changeWindowDimensions(float buffWidth, float buffHeight);
|
void changeWindowDimensions(glm::vec2 size);
|
||||||
|
|
||||||
glm::vec3 getPos();
|
glm::vec3 getPos();
|
||||||
void setPos(glm::vec3 pos);
|
void setPos(glm::vec3 pos);
|
||||||
|
|
|
@ -9,124 +9,33 @@ Renderer::Renderer() : Renderer(1366, 768) {};
|
||||||
Renderer::Renderer(GLint winWidth, GLint winHeight) :
|
Renderer::Renderer(GLint winWidth, GLint winHeight) :
|
||||||
activeTexture(nullptr),
|
activeTexture(nullptr),
|
||||||
window(winWidth, winHeight),
|
window(winWidth, winHeight),
|
||||||
swayData(new unsigned char[16 * 4 * 16]),
|
|
||||||
|
|
||||||
ssao({winWidth, winHeight}, 1, 32),
|
world({winWidth, winHeight}, 2),
|
||||||
blur({winWidth, winHeight}, 1) {
|
entity({winWidth, winHeight}, 2),
|
||||||
|
ssao({winWidth, winHeight}, 1, 16),
|
||||||
|
blur({winWidth, winHeight}, 1),
|
||||||
|
lighting({winWidth, winHeight}, 2) {
|
||||||
|
|
||||||
window.initialize();
|
window.initialize();
|
||||||
auto winSize = window.getSize();
|
camera.create(window.getSize().x, window.getSize().y, glm::vec3(0, 1, 0));
|
||||||
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);
|
|
||||||
|
|
||||||
ssao.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/ssaoCalc.fs");
|
ssao.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/ssaoCalc.fs");
|
||||||
blur.createFromFile("./assets/shader/post/passThrough.vs", "./assets/shader/post/ssaoBlur.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();
|
guiShader = Shader();
|
||||||
createGUIShader();
|
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);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glEnable(GL_CULL_FACE);
|
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
|
//Initialize Shading Shader for Shadowmapping
|
||||||
|
|
||||||
// const unsigned int SHADOW_SCALE = 2048;
|
// const unsigned int SHADOW_SCALE = 2048;
|
||||||
|
@ -143,124 +52,59 @@ void Renderer::createWorldShaders() {
|
||||||
// glDrawBuffer(GL_NONE);
|
// glDrawBuffer(GL_NONE);
|
||||||
// glReadBuffer(GL_NONE);
|
// glReadBuffer(GL_NONE);
|
||||||
// glBindBuffer(GL_FRAMEBUFFER, 0);
|
// 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) {
|
void Renderer::update(double delta) {
|
||||||
//VSync 1 = On, 0 = Off
|
//VSync 1 = On, 0 = Off
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
window.update();
|
|
||||||
elapsedTime += delta;
|
elapsedTime += delta;
|
||||||
|
|
||||||
swayOffset += delta * 1.4;
|
window.update();
|
||||||
for (int i = 0; i < 16 * 16; i++) {
|
world.updateSwayMap(delta);
|
||||||
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);
|
|
||||||
|
|
||||||
if (window.resized) {
|
if (window.resized) {
|
||||||
ssao.windowResized(window.getSize());
|
ssao.windowResized(window.getSize());
|
||||||
blur.windowResized(window.getSize());
|
blur.windowResized(window.getSize());
|
||||||
|
lighting.windowResized(window.getSize());
|
||||||
|
world.windowResized(window.getSize());
|
||||||
|
|
||||||
resized = true;
|
resized = true;
|
||||||
window.resized = false;
|
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();
|
gu.matrix = camera.getOrthographicMatrix();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::beginChunkDeferredCalls() {
|
void Renderer::beginChunkDeferredCalls() {
|
||||||
activeTexture = nullptr;
|
activeTexture = nullptr;
|
||||||
currentModelUniform = wgu.model;
|
currentModelUniform = world.uniforms.model;
|
||||||
|
|
||||||
auto winSize = window.getSize();
|
glClearColor(0, 0, 0, 0);
|
||||||
winSize *= renderScale;
|
|
||||||
|
|
||||||
glClearColor(clearColor.x, clearColor.y, clearColor.z, 0);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDisable(GL_BLEND);
|
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);
|
world.use();
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
world.set(world.uniforms.proj, camera.getProjectionMatrix());
|
||||||
|
world.set(world.uniforms.view, camera.getViewMatrix());
|
||||||
worldGeometryShader.use();
|
world.set(world.uniforms.time, static_cast<float>(elapsedTime));
|
||||||
|
world.swayTex.use(1);
|
||||||
worldGeometryShader.set(wgu.proj, wgu.matrix);
|
|
||||||
worldGeometryShader.set(wgu.view, camera.getViewMatrix());
|
|
||||||
|
|
||||||
worldGeometryShader.set(wgu.time, static_cast<float>(elapsedTime));
|
|
||||||
|
|
||||||
swayTex.use(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::beginEntityDeferredCalls() {
|
void Renderer::beginEntityDeferredCalls() {
|
||||||
currentModelUniform = egu.model;
|
currentModelUniform = entity.uniforms.model;
|
||||||
|
|
||||||
entityGeometryShader.use();
|
entity.use();
|
||||||
|
entity.set(entity.uniforms.proj, camera.getProjectionMatrix());
|
||||||
entityGeometryShader.set(egu.proj, egu.matrix);
|
entity.set(entity.uniforms.view, camera.getViewMatrix());
|
||||||
entityGeometryShader.set(egu.view, camera.getViewMatrix());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::endDeferredCalls() {
|
void Renderer::endDeferredCalls() {
|
||||||
activeTexture = nullptr;
|
activeTexture = nullptr;
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, ssao.fbo);
|
glBindFramebuffer(GL_FRAMEBUFFER, ssao.fbo);
|
||||||
glClearColor(0, 0, 0, 0);
|
glClearColor(clearColor.x, clearColor.y, clearColor.z, 0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
ssao.use();
|
ssao.use();
|
||||||
|
@ -269,13 +113,14 @@ void Renderer::endDeferredCalls() {
|
||||||
ssao.set(ssao.uniforms.kernelCount, ssao.kernelCount);
|
ssao.set(ssao.uniforms.kernelCount, ssao.kernelCount);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < ssao.kernelCount; i++) {
|
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);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, gPosition);
|
glBindTexture(GL_TEXTURE_2D, lighting.gPosition);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, gNormal);
|
glBindTexture(GL_TEXTURE_2D, lighting.gNormal);
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_2D, ssao.tex);
|
glBindTexture(GL_TEXTURE_2D, ssao.tex);
|
||||||
|
|
||||||
|
@ -296,16 +141,15 @@ void Renderer::endDeferredCalls() {
|
||||||
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
|
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
worldLightingShader.use();
|
lighting.use();
|
||||||
|
lighting.set(lighting.uniforms.camPosition, camera.getPos());
|
||||||
worldLightingShader.set(wlu.camPosition, camera.getPos());
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, blur.colorBuffer);
|
glBindTexture(GL_TEXTURE_2D, blur.colorBuffer);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, gNormal);
|
glBindTexture(GL_TEXTURE_2D, lighting.gNormal);
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_2D, gColorSpec);
|
glBindTexture(GL_TEXTURE_2D, lighting.gColorSpec);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
renderQuad();
|
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) {
|
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};
|
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) {
|
void Renderer::setBones(std::vector<glm::mat4> &transforms) {
|
||||||
if (transforms.empty()) return;
|
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
|
#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/Shader.h"
|
||||||
#include "shader/SSAOShader.h"
|
#include "shader/SSAOShader.h"
|
||||||
#include "shader/BlurShader.h"
|
#include "shader/BlurShader.h"
|
||||||
#include "window/Window.h"
|
#include "shader/LightingShader.h"
|
||||||
#include "Camera.h"
|
#include "shader/WorldGeometryShader.h"
|
||||||
#include "Texture.h"
|
#include "shader/EntityGeometryShader.h"
|
||||||
#include "shader/uniform/GuiUniforms.h"
|
#include "shader/uniform/GuiUniforms.h"
|
||||||
#include "shader/uniform/WorldLightingUniforms.h"
|
#include "meshtypes/ChunkMesh.h"
|
||||||
#include "shader/uniform/WorldGeometryUniforms.h"
|
|
||||||
#include "shader/uniform/EntityGeometryUniforms.h"
|
|
||||||
#include <glm/ext.hpp>
|
|
||||||
#include <noise/noise.h>
|
|
||||||
|
|
||||||
class Renderer {
|
class Renderer {
|
||||||
public:
|
public:
|
||||||
Renderer();
|
Renderer();
|
||||||
Renderer(GLint winWidth, GLint winHeight);
|
Renderer(GLint winWidth, GLint winHeight);
|
||||||
|
|
||||||
void createWorldShaders();
|
|
||||||
void createGUIShader();
|
|
||||||
|
|
||||||
void update(double delta);
|
void update(double delta);
|
||||||
|
|
||||||
void beginChunkDeferredCalls();
|
void beginChunkDeferredCalls();
|
||||||
|
@ -43,37 +40,26 @@ public:
|
||||||
Window& getWindow();
|
Window& getWindow();
|
||||||
Camera& getCamera();
|
Camera& getCamera();
|
||||||
|
|
||||||
~Renderer();
|
|
||||||
|
|
||||||
bool resized;
|
bool resized;
|
||||||
private:
|
private:
|
||||||
void renderQuad();
|
void renderQuad();
|
||||||
|
|
||||||
unsigned int quadVAO = 0, quadVBO;
|
unsigned int quadVAO = 0, quadVBO;
|
||||||
float renderScale = 2.0f;
|
|
||||||
|
|
||||||
Window window;
|
Window window;
|
||||||
Camera camera;
|
Camera camera;
|
||||||
|
|
||||||
unsigned int gBuffer, gPosition, gNormal, gColorSpec, rboDepth;
|
|
||||||
unsigned int sBuffer, sDepthMap;
|
unsigned int sBuffer, sDepthMap;
|
||||||
|
|
||||||
Texture swayTex;
|
|
||||||
double swayOffset = 0;
|
|
||||||
noise::module::Perlin swayNoise;
|
|
||||||
unsigned char* swayData = nullptr;
|
|
||||||
|
|
||||||
glm::vec4 clearColor {0, 0, 0, 1};
|
glm::vec4 clearColor {0, 0, 0, 1};
|
||||||
Texture* activeTexture;
|
Texture* activeTexture;
|
||||||
|
|
||||||
Shader worldGeometryShader;
|
WorldGeometryShader world;
|
||||||
WorldGeometryUniforms wgu;
|
EntityGeometryShader entity;
|
||||||
Shader entityGeometryShader;
|
|
||||||
EntityGeometryUniforms egu;
|
|
||||||
SSAOShader ssao;
|
SSAOShader ssao;
|
||||||
BlurShader blur;
|
BlurShader blur;
|
||||||
Shader worldLightingShader;
|
LightingShader lighting;
|
||||||
WorldLightingUniforms wlu;
|
|
||||||
Shader guiShader;
|
Shader guiShader;
|
||||||
GuiUniforms gu;
|
GuiUniforms gu;
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,8 @@ void BlurShader::postCreate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlurShader::windowResized(glm::vec2 windowSize) {
|
void BlurShader::windowResized(glm::vec2 windowSize) {
|
||||||
|
this->windowSize = windowSize;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
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);
|
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);
|
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) {
|
void SSAOShader::windowResized(glm::vec2 windowSize) {
|
||||||
|
this->windowSize = windowSize;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
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);
|
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);
|
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