From 5b4a862f834eef798762660a73c6ae9881368460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 17 Jul 2020 02:15:41 +0200 Subject: GPUTexture: Add better swizzle support --- source/blender/gpu/GPU_texture.h | 2 +- source/blender/gpu/intern/gpu_draw_smoke.c | 2 +- source/blender/gpu/intern/gpu_texture.c | 35 +++++++++++++++++++++++++----- 3 files changed, 32 insertions(+), 7 deletions(-) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index f9e129b2f7a..9c7cc6b5e32 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -275,7 +275,7 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp); void GPU_texture_filters(GPUTexture *tex, eGPUFilterFunction min_filter, eGPUFilterFunction mag_filter); -void GPU_texture_swizzle_channel_auto(GPUTexture *tex, int channels); +void GPU_texture_swizzle_set(GPUTexture *tex, const char swizzle[4]); void GPU_texture_attach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb, int attachment); int GPU_texture_detach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb); diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c index 79b3861d339..89261afaebd 100644 --- a/source/blender/gpu/intern/gpu_draw_smoke.c +++ b/source/blender/gpu/intern/gpu_draw_smoke.c @@ -128,7 +128,7 @@ static void swizzle_texture_channel_single(GPUTexture *tex) /* Swizzle texture channels so that we get useful RGBA values when sampling * a texture with fewer channels, e.g. when using density as color. */ GPU_texture_bind(tex, 0); - GPU_texture_swizzle_channel_auto(tex, 1); + GPU_texture_swizzle_set(tex, "rrr1"); GPU_texture_unbind(tex); } diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c index 251a4d71597..c4d7eccf9f9 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -1962,15 +1962,40 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp) SET_FLAG_FROM_TEST(tex->sampler_state, !use_clamp, GPU_SAMPLER_CLAMP_BORDER); } -void GPU_texture_swizzle_channel_auto(GPUTexture *tex, int channels) +static int gpu_texture_swizzle_to_enum(const char swizzle) +{ + switch (swizzle) { + case 'w': + case 'a': + return GL_ALPHA; + case 'z': + case 'b': + return GL_BLUE; + case 'y': + case 'g': + return GL_GREEN; + case '0': + return GL_ZERO; + case '1': + return GL_ONE; + case 'x': + case 'r': + default: + return GL_RED; + } +} + +void GPU_texture_swizzle_set(GPUTexture *tex, const char swizzle[4]) { WARN_NOT_BOUND(tex); + GLint gl_swizzle[4] = {gpu_texture_swizzle_to_enum(swizzle[0]), + gpu_texture_swizzle_to_enum(swizzle[1]), + gpu_texture_swizzle_to_enum(swizzle[2]), + gpu_texture_swizzle_to_enum(swizzle[3])}; + glActiveTexture(GL_TEXTURE0 + tex->number); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, (channels >= 2) ? GL_GREEN : GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, (channels >= 3) ? GL_BLUE : GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, (channels >= 4) ? GL_ALPHA : GL_ONE); + glTexParameteriv(tex->target_base, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle); } void GPU_texture_free(GPUTexture *tex) -- cgit v1.2.3