GPUTexture: Add better swizzle support

This commit is contained in:
Clément Foucault 2020-07-17 02:15:41 +02:00
parent 2840782d84
commit 5b4a862f83
Notes: blender-bot 2023-02-13 21:44:05 +01:00
Referenced by issue #79089, Exception When Changing to Blender Light Theme
4 changed files with 33 additions and 8 deletions

View File

@ -266,7 +266,7 @@ static DRWVolumeGrid *volume_grid_cache_get(Volume *volume,
NULL);
GPU_texture_bind(cache_grid->texture, 0);
GPU_texture_swizzle_channel_auto(cache_grid->texture, channels);
GPU_texture_swizzle_set(cache_grid->texture, (channels == 3) ? "rgb1" : "rrr1");
GPU_texture_wrap_mode(cache_grid->texture, false, false);
GPU_texture_unbind(cache_grid->texture);

View File

@ -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);

View File

@ -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);
}

View File

@ -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)