Browse Source

chunk rendering using tiles texture, not array

feature/replace-renderer
Martin Dørum 3 years ago
parent
commit
14050ceb74
4 changed files with 40 additions and 21 deletions
  1. 1
    0
      libcygnet/src/GlWrappers.cc
  2. 31
    13
      libcygnet/src/Renderer.cc
  3. 1
    1
      libcygnet/src/TileAtlas.cc
  4. 7
    7
      libcygnet/src/shaders.cc

+ 1
- 0
libcygnet/src/GlWrappers.cc View File

@@ -39,6 +39,7 @@ GlShader::GlShader(Type type, const char *source) {
glGetShaderiv(id_, GL_COMPILE_STATUS, &status);
glCheck();
if (status == GL_FALSE) {
std::cerr << "Cygnet: Here's the broken shader:\n" << source << '\n';
throw GlCompileError("GL shader compilation failed.");
}
}

+ 31
- 13
libcygnet/src/Renderer.cc View File

@@ -4,6 +4,7 @@
#include <stdio.h>
#include <SDL_opengles2.h>
#include <swan-common/constants.h>
#include <string.h>

#include "shaders.h"
#include "GlWrappers.h"
@@ -79,10 +80,11 @@ struct ChunkProg: public GlProgram {
GLint camera = uniformLoc("camera");
GLint pos = uniformLoc("pos");
GLint vertex = attribLoc("vertex");
GLint tileTex = uniformLoc("tileTex");
GLint tileTexSize = uniformLoc("tileTexSize");
GLint tileAtlas = uniformLoc("tileAtlas");
GLint tileAtlasSize = uniformLoc("tileAtlasSize");
GLint tiles = uniformLoc("tiles");

GLuint tilesTex;
GLuint vbo;

static constexpr float ch = (float)SwanCommon::CHUNK_HEIGHT;
@@ -113,6 +115,16 @@ struct ChunkProg: public GlProgram {
glGenBuffers(1, &vbo);
glCheck();

glGenTextures(1, &tilesTex);
glCheck();

glBindTexture(GL_TEXTURE_2D, tilesTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glCheck();

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW);
glCheck();
@@ -120,6 +132,7 @@ struct ChunkProg: public GlProgram {

void deinit() {
glDeleteBuffers(1, &vbo);
glDeleteTextures(1, &tilesTex);
glCheck();
}
};
@@ -146,24 +159,29 @@ Renderer::~Renderer() = default;
void Renderer::draw() {
state_->chunkProg.enable();

state_->camera.reset().translate(-0.5, 0.5).scale(0.25, 0.25);
glUniformMatrix3fv(state_->chunkProg.camera, 1, GL_TRUE, state_->camera.data());
glCheck();

GLint tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT] = {0};
tiles[0] = 3;
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, state_->chunkProg.tilesTex); // Necessary?
glUniform1i(state_->chunkProg.tiles, 1);
uint8_t tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT * 3];
memset(tiles, 0x00, sizeof(tiles));
tiles[1] = 1;
glUniform1iv(state_->chunkProg.tiles, sizeof(tiles) / sizeof(*tiles), tiles);
tiles[4] = 2;
tiles[7] = 3;
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, SwanCommon::CHUNK_WIDTH, SwanCommon::CHUNK_HEIGHT,
0, GL_RGB, GL_UNSIGNED_BYTE, tiles);
glCheck();

glUniform2f(state_->chunkProg.tileTexSize,
glUniform2f(state_->chunkProg.tileAtlasSize,
(float)(int)(state_->atlasTex.width() / SwanCommon::TILE_SIZE),
(float)(int)(state_->atlasTex.height() / SwanCommon::TILE_SIZE));
glCheck();

state_->camera.reset().translate(-0.9, 0.9).scale(0.25, 0.25);
glUniformMatrix3fv(state_->chunkProg.camera, 1, GL_TRUE, state_->camera.data());

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,state_->atlasTex.id()); // Necessary?
glUniform1i(state_->chunkProg.tileTex, 0);
glBindTexture(GL_TEXTURE_2D, state_->atlasTex.id());
glUniform1i(state_->chunkProg.tileAtlas, 0);
glCheck();

glDrawArrays(GL_TRIANGLES, 0, 6);

+ 1
- 1
libcygnet/src/TileAtlas.cc View File

@@ -21,7 +21,7 @@ struct AtlasState {
TileAtlas::TileAtlas(): state_(std::make_unique<AtlasState>()) {
GLint size;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);
state_->tilesPerLine = std::min(size / SwanCommon::TILE_SIZE, 1024);
state_->tilesPerLine = std::min(size / SwanCommon::TILE_SIZE, 256);
}

TileAtlas::~TileAtlas() = default;

+ 7
- 7
libcygnet/src/shaders.cc View File

@@ -46,20 +46,20 @@ const char *chunkFr = R"glsl(
#define CHUNK_HEIGHT 64

varying vec2 v_tileCoord;
uniform sampler2D tileTex;
uniform vec2 tileTexSize;
uniform int tiles[CHUNK_WIDTH * CHUNK_HEIGHT];
uniform sampler2D tileAtlas;
uniform vec2 tileAtlasSize;
uniform sampler2D tiles;

void main() {
vec2 tilePos = floor(vec2(v_tileCoord.x, -v_tileCoord.y));
int tileIndex = int(tilePos.y * float(CHUNK_WIDTH) + tilePos.x);
float tileID = float(tiles[tileIndex]);
vec4 tileColor = texture2D(tiles, tilePos / vec2(CHUNK_WIDTH, CHUNK_HEIGHT));
float tileID = floor((tileColor.r * 256.0 + tileColor.g) * 256.0);

vec2 atlasPos = vec2(
tileID + v_tileCoord.x - tilePos.x,
floor(tileID / tileTexSize.x) - v_tileCoord.y - tilePos.y);
floor(tileID / tileAtlasSize.x) - v_tileCoord.y - tilePos.y);

gl_FragColor = texture2D(tileTex, fract(atlasPos / tileTexSize));
gl_FragColor = texture2D(tileAtlas, fract(atlasPos / tileAtlasSize));
}
)glsl";


Loading…
Cancel
Save