T55486: use GPU_R11F_G11F_B10F for Matcaps

This commit is contained in:
Jeroen Bakker 2018-06-15 08:57:49 +02:00
parent b7338463a7
commit 64bfa4b300
2 changed files with 27 additions and 6 deletions

View File

@ -98,6 +98,7 @@ typedef struct StudioLight {
ImBuf *radiance_cubemap_buffers[6];
struct GPUTexture *equirectangular_radiance_gputexture;
struct GPUTexture *equirectangular_irradiance_gputexture;
float *gpu_matcap_3components; /* 3 channel buffer for GPU_R11F_G11F_B10F */
} StudioLight;
void BKE_studiolight_init(void);

View File

@ -96,6 +96,10 @@ static void studiolight_free(struct StudioLight *sl)
MEM_freeN(sl->path_irr);
sl->path_irr = NULL;
}
if (sl->gpu_matcap_3components) {
MEM_freeN(sl->gpu_matcap_3components);
sl->gpu_matcap_3components = NULL;
}
MEM_freeN(sl);
}
@ -188,12 +192,28 @@ static void studiolight_create_equierectangular_radiance_gputexture(StudioLight
char error[256];
BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED);
ImBuf *ibuf = sl->equirectangular_radiance_buffer;
sl->equirectangular_radiance_gputexture = GPU_texture_create_2D(ibuf->x, ibuf->y, GPU_RGBA16F, ibuf->rect_float, error);
GPUTexture *tex = sl->equirectangular_radiance_gputexture;
GPU_texture_bind(tex, 0);
GPU_texture_filter_mode(tex, true);
GPU_texture_wrap_mode(tex, true);
GPU_texture_unbind(tex);
if (sl->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL) {
sl->gpu_matcap_3components = MEM_callocN(sizeof(float) * ibuf->x * ibuf->y * 3, __func__);
float* offset4 = ibuf->rect_float;
float* offset3 = sl->gpu_matcap_3components;
for (int i = 0 ; i < ibuf->x * ibuf->y; i ++)
{
copy_v3_v3(offset3, offset4);
offset3 += 3;
offset4 += 4;
}
sl->equirectangular_radiance_gputexture = GPU_texture_create_2D(ibuf->x, ibuf->y, GPU_R11F_G11F_B10F, sl->gpu_matcap_3components, error);
}
else {
sl->equirectangular_radiance_gputexture = GPU_texture_create_2D(ibuf->x, ibuf->y, GPU_RGBA16F, ibuf->rect_float, error);
GPUTexture *tex = sl->equirectangular_radiance_gputexture;
GPU_texture_bind(tex, 0);
GPU_texture_filter_mode(tex, true);
GPU_texture_wrap_mode(tex, true);
GPU_texture_unbind(tex);
}
}
sl->flag |= STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE;
}