diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-07-17 03:15:41 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-07-18 04:43:51 +0300 |
commit | 5b4a862f834eef798762660a73c6ae9881368460 (patch) | |
tree | 7c90b49c77fa26fa69e624260cae4450502f5e4b /source/blender/gpu/intern | |
parent | 2840782d8478f1c37c2aa91cc7f12c8e1f4dca0a (diff) |
GPUTexture: Add better swizzle support
Diffstat (limited to 'source/blender/gpu/intern')
-rw-r--r-- | source/blender/gpu/intern/gpu_draw_smoke.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_texture.c | 35 |
2 files changed, 31 insertions, 6 deletions
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) |