diff --git a/res/shaders/main.glslf b/res/shaders/main.glslf index 7db1a544..4992c36b 100644 --- a/res/shaders/main.glslf +++ b/res/shaders/main.glslf @@ -16,8 +16,11 @@ void main() { vec4 tex_color = texture(u_texture0, a_texCoord); float depth = (a_distance/256.0); float alpha = a_color.a * tex_color.a; - if (u_alphaClip && alpha < 0.9f) - discard; + if (u_alphaClip) { + if (alpha < 0.2f) + discard; + alpha = 1.0; + } f_color = mix(a_color * tex_color, vec4(fogColor,1.0), min(1.0, pow(depth*u_fogFactor, u_fogCurve))); f_color.a = alpha; diff --git a/src/graphics/core/GLTexture.cpp b/src/graphics/core/GLTexture.cpp index 3756d758..c5a918ed 100644 --- a/src/graphics/core/GLTexture.cpp +++ b/src/graphics/core/GLTexture.cpp @@ -25,7 +25,7 @@ GLTexture::GLTexture(const ubyte* data, uint width, uint height, ImageFormat ima glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/src/graphics/core/ImageData.cpp b/src/graphics/core/ImageData.cpp index ccf9f908..d6617c57 100644 --- a/src/graphics/core/ImageData.cpp +++ b/src/graphics/core/ImageData.cpp @@ -242,18 +242,34 @@ void ImageData::extrude(int x, int y, int w, int h) { } } +// Fixing black transparent pixels for Mip-Mapping void ImageData::fixAlphaColor() { - // Fixing black transparent pixels for Mip-Mapping - for (uint ly = 0; ly < height-1; ly++) { - for (uint lx = 0; lx < width-1; lx++) { - if (data[((ly) * width + lx) * 4 + 3]) { - for (int c = 0; c < 3; c++) { - int val = data[((ly) + + lx) * 4 + c]; - if (data[((ly) * width + lx + 1) * 4 + 3] == 0) - data[((ly) * width + lx + 1) * 4 + c] = val; - if (data[((ly + 1) * width + lx) * 4 + 3] == 0) - data[((ly + 1) * width + lx) * 4 + c] = val; - } + int samples = 0; + int sums[3] {}; + for (uint ly = 0; ly < height; ly++) { + for (uint lx = 0; lx < width; lx++) { + if (data[(ly * width + lx) * 4 + 3] == 0) { + continue; + } + samples++; + for (int c = 0; c < 3; c++) { + sums[c] += data[(ly * width + lx) * 4 + c]; + } + } + } + if (samples == 0) { + return; + } + for (int i = 0; i < 3; i++) { + sums[i] /= samples; + } + for (uint ly = 0; ly < height; ly++) { + for (uint lx = 0; lx < width; lx++) { + if (data[(ly * width + lx) * 4 + 3] != 0) { + continue; + } + for (int i = 0; i < 3; i++) { + data[(ly * width + lx) * 4 + i] = sums[i]; } } } diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 60a09eb0..f669cfea 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -197,7 +197,7 @@ void ChunksRenderer::drawChunks( // TODO: minimize draw calls number for (int i = indices.size()-1; i >= 0; i--) { - auto chunk = chunks.getChunks()[indices[i].index]; + auto& chunk = chunks.getChunks()[indices[i].index]; auto mesh = retrieveChunk(indices[i].index, camera, shader, culling); if (mesh) {