Deferred rendering engine

master
aurailus 2019-06-17 00:17:24 -07:00
parent 6b99bbd9a0
commit d500fe65c4
8 changed files with 45 additions and 45 deletions

View File

@ -11,7 +11,10 @@ in vec3 normal;
uniform sampler2D tex;
void main() {
vec4 spec = texture(tex, texCoords);
if (spec.a < 0.1) discard;
gPosition = vec4(fragPos, 1);
gNormal = vec4(normalize(normal), 1);
gSpecular = texture(tex, texCoords);
gSpecular = spec;
}

View File

@ -14,11 +14,11 @@ out vec3 fragPos;
out vec3 normal;
void main() {
vec4 worldPos = model * vec4(aPos, 1.0);
vec4 modelViewPos = view * model * vec4(aPos, 1.0);
fragPos = worldPos.xyz;
fragPos = modelViewPos.xyz;
texCoords = aTexCoords.xy;
normal = transpose(inverse(mat3(model))) * aNormal;
gl_Position = projection * view * worldPos;
gl_Position = projection * modelViewPos;
}

View File

@ -1,6 +1,9 @@
#version 330 core
out vec4 fragColor;
#define NEAR_FOG vec3(0.40, 0.56, 0.72)
#define FAR_FOG vec3(0.58, 0.76, 0.94)
out vec4 outColor;
in vec2 texCoords;
@ -13,5 +16,14 @@ void main() {
vec3 normal = texture(gNormal, texCoords).rgb;
vec3 color = texture(gColorSpec, texCoords).rgb;
fragColor = vec4(normal, 1.0);
float shading = (0.8 + abs(normal.x) * 0.15) + (normal.y * 0.15) + 0.2;
float dist = distance(vec3(0, 0, 0), vec3(fragPos));
float nearFog = min(max(dist - 200, 0) / 100, 1);
float farFog = min(max(dist - 250, 0) / 100, 1);
vec3 fragColor = color * vec3(shading);
vec3 shadedColor = mix(mix(vec3(fragColor), NEAR_FOG, nearFog), FAR_FOG, farFog);
outColor = vec4(shadedColor, 1);
}

View File

@ -21,7 +21,6 @@ Renderer::Renderer(GLint winWidth, GLint winHeight) :
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
@ -114,8 +113,11 @@ void Renderer::update() {
}
void Renderer::beginWorldDrawCalls() {
activeTexture = nullptr;
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@ -149,22 +151,21 @@ void Renderer::endWorldDrawCalls() {
0, 0, static_cast<int>(winSize.x), static_cast<int>(winSize.y),
GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void Renderer::beginGUIDrawCalls() {
glClear(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
guiShader.use();
glUniformMatrix4fv(gu.ortho, 1, GL_FALSE, glm::value_ptr(gu.matrix));
}
void Renderer::swapBuffers() {
Shader::clearShader();
window.swapBuffers();
}
//void Renderer::beginGUI() {
// glClear(GL_DEPTH_BUFFER_BIT);
// glDisable(GL_DEPTH_TEST);
// enableGuiShader();
//}
//
//void Renderer::end() {
// Shader::clearShader();
// window.swapBuffers();
//}
Window *Renderer::getWindow() {
return &window;
}
@ -173,13 +174,6 @@ Camera *Renderer::getCamera() {
return &camera;
}
//void Renderer::enableGuiShader() {
// guiShader.use();
// mode = true;
//
// glUniformMatrix4fv(gu.ortho, 1, GL_FALSE, glm::value_ptr(gu.matrix));
//}
void Renderer::renderQuad() {
if (quadVAO == 0) {
float quadVertices[] = {

View File

@ -26,9 +26,8 @@ public:
void beginWorldDrawCalls();
void endWorldDrawCalls();
// void beginGUI();
// void end();
void beginGUIDrawCalls();
void swapBuffers();
void setModelMatrix(glm::mat4& modelMatrix);
void enableTexture(Texture* texture);
@ -40,7 +39,6 @@ public:
bool resized;
private:
// void enableGuiShader();
void renderQuad();
unsigned int quadVAO = 0, quadVBO;
@ -51,8 +49,8 @@ private:
unsigned int gBuffer;
unsigned int gPosition, gNormal, gColorSpec;
// glm::vec4 clearColor {0.58f, 0.76f, 0.94f, 1.0f};
glm::vec4 clearColor {0.0f, 0.0f, 0.0f, 1.0f};
// glm::vec4 clearColor {0.0f, 0.0f, 0.0f, 1.0f};
glm::vec4 clearColor {0.58f, 0.76f, 0.94f, 1.0f};
Texture* activeTexture;
Shader worldGeometryShader;

View File

@ -65,25 +65,18 @@ void GameScene::draw() {
auto &renderer = *state->renderer;
auto &camera = *renderer.getCamera();
drawCalls = 0;
renderer.beginWorldDrawCalls();
renderer.enableTexture(&defs.textures().getAtlasTexture());
drawCalls = world.render(renderer);
for (auto entity : entities) entity->draw(renderer);
renderer.endWorldDrawCalls();
renderer.beginGUIDrawCalls();
// state->renderer->beginGUI();
//
// for (auto entity : gui) {
// entity->draw(renderer);
// }
//
// state->renderer->end();
for (auto entity : gui) entity->draw(renderer);
renderer.swapBuffers();
}
void GameScene::cleanup() {

View File

@ -13,8 +13,8 @@
class ServerPlayer {
public:
const static int ACTIVE_RANGE_H = 16;
const static int ACTIVE_RANGE_V = 8;
const static int ACTIVE_RANGE_H = 24;
const static int ACTIVE_RANGE_V = 12;
explicit ServerPlayer(ServerPeer* peer, std::string uuid, std::string username);

View File

@ -59,7 +59,7 @@ void Dimension::update() {
float distance = max(abs(diffVec.x), max(abs(diffVec.y), abs(diffVec.z)));
//TODO: Don't hard code this number
if (distance > 30) {
if (distance > 24) {
if (chunk->meshChunk != nullptr) {
meshChunks.erase(chunk->meshChunkIter);
delete chunk->meshChunk;