GPUTexture: Support for nearest sampling with mipmaps.

This commit is contained in:
2017-06-22 01:53:51 +02:00
parent 4ceb006706
commit fe2ff3fc89
3 changed files with 9 additions and 5 deletions

View File

@@ -390,11 +390,13 @@ static void drw_texture_get_format(DRWTextureFormat format, GPUTextureFormat *da
static void drw_texture_set_parameters(GPUTexture *tex, DRWTextureFlag flags)
{
GPU_texture_bind(tex, 0);
GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER);
if (flags & DRW_TEX_MIPMAP) {
GPU_texture_mipmap_mode(tex, true);
GPU_texture_mipmap_mode(tex, true, flags & DRW_TEX_FILTER);
DRW_texture_generate_mipmaps(tex);
}
else {
GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER);
}
GPU_texture_wrap_mode(tex, flags & DRW_TEX_WRAP);
GPU_texture_compare_mode(tex, flags & DRW_TEX_COMPARE);
GPU_texture_unbind(tex);

View File

@@ -181,7 +181,7 @@ int GPU_texture_bound_number(GPUTexture *tex);
void GPU_texture_generate_mipmap(GPUTexture *tex);
void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare);
void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter);
void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap);
void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter);
void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat);
struct GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex);

View File

@@ -856,7 +856,7 @@ void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter)
glActiveTexture(GL_TEXTURE0);
}
void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap)
void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter)
{
if (tex->number >= GPU_max_textures()) {
fprintf(stderr, "Not enough texture slots.\n");
@@ -869,7 +869,9 @@ void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap)
if (tex->number != 0)
glActiveTexture(GL_TEXTURE0 + tex->number);
GLenum mipmap = use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR;
GLenum mipmap = (use_filter)
? use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR
: use_mipmap ? GL_NEAREST_MIPMAP_LINEAR : GL_NEAREST;
glTexParameteri(tex->target_base, GL_TEXTURE_MIN_FILTER, mipmap);
if (tex->number != 0)