GPUTexture: Add better swizzle support
This commit is contained in:
parent
2840782d84
commit
5b4a862f83
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user