RenderViewport: Texture Format
When doing viewport rendering the color management happens on the CPU. This has overhead in downloading a float texture from the gpu and performing color management on the CPU. Based on the scene fileformat bit depth the result will be rendered to a byte texture where the colormanagement happens on the GPU or a float texture where the colormanagement happens on the CPU. This is only done during `Viewport Render Animation` in other cases a float texture is being used. Baseline (HD render of wanderer.blend workbench engine no samples) 15.688038 s After changes: 9.412880s Reviewed By: fclem Differential Revision: https://developer.blender.org/D6195
This commit is contained in:
parent
9d7f65630b
commit
7959dcd4f6
Notes:
blender-bot
2023-02-13 23:39:48 +01:00
Referenced by issue #79999, Double post processing frames with color management, when animation rendered Referenced by issue #77909, 2.83lts Regression: Viewport render image ignores colormanagement, and appears to be hardcoded to use sRGB.
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
/** \file
|
||||
* \ingroup edrend
|
||||
* \ingroup render
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
@ -77,7 +77,7 @@
|
|||
#include "render_intern.h"
|
||||
|
||||
/* Define this to get timing information. */
|
||||
// #undef DEBUG_TIME
|
||||
// #define DEBUG_TIME
|
||||
|
||||
#ifdef DEBUG_TIME
|
||||
# include "PIL_time.h"
|
||||
|
@ -138,6 +138,8 @@ typedef struct OGLRender {
|
|||
TaskPool *task_pool;
|
||||
bool pool_ok;
|
||||
bool is_animation;
|
||||
|
||||
eImageFormatDepth color_depth;
|
||||
SpinLock reports_lock;
|
||||
unsigned int num_scheduled_frames;
|
||||
ThreadMutex task_mutex;
|
||||
|
@ -356,6 +358,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
|
|||
char err_out[256] = "unknown";
|
||||
ImBuf *ibuf_view;
|
||||
const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL;
|
||||
int output_flags = oglrender->color_depth <= R_IMF_CHAN_DEPTH_8 ? IB_rect : IB_rectfloat;
|
||||
|
||||
if (view_context) {
|
||||
ibuf_view = ED_view3d_draw_offscreen_imbuf(depsgraph,
|
||||
|
@ -365,7 +368,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
|
|||
ar,
|
||||
sizex,
|
||||
sizey,
|
||||
IB_rectfloat,
|
||||
output_flags,
|
||||
alpha_mode,
|
||||
oglrender->ofs_samples,
|
||||
viewname,
|
||||
|
@ -385,7 +388,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
|
|||
scene->camera,
|
||||
oglrender->sizex,
|
||||
oglrender->sizey,
|
||||
IB_rectfloat,
|
||||
output_flags,
|
||||
V3D_OFSDRAW_SHOW_ANNOTATION,
|
||||
alpha_mode,
|
||||
oglrender->ofs_samples,
|
||||
|
@ -528,6 +531,8 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
|
|||
const bool is_animation = RNA_boolean_get(op->ptr, "animation");
|
||||
const bool is_sequencer = RNA_boolean_get(op->ptr, "sequencer");
|
||||
const bool is_write_still = RNA_boolean_get(op->ptr, "write_still");
|
||||
const eImageFormatDepth color_depth = (is_animation) ? scene->r.im_format.depth :
|
||||
R_IMF_CHAN_DEPTH_32;
|
||||
const int samples = U.ogl_multisamples;
|
||||
char err_out[256] = "unknown";
|
||||
|
||||
|
@ -600,6 +605,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
|
|||
|
||||
oglrender->write_still = is_write_still && !is_animation;
|
||||
oglrender->is_animation = is_animation;
|
||||
oglrender->color_depth = color_depth;
|
||||
|
||||
oglrender->views_len = BKE_scene_multiview_num_views_get(&scene->r);
|
||||
|
||||
|
|
|
@ -483,13 +483,23 @@ typedef struct ImageFormatData {
|
|||
#define R_IMF_FLAG_PREVIEW_JPG (1 << 1) /* was R_PREVIEW_JPG */
|
||||
|
||||
/* return values from BKE_imtype_valid_depths, note this is depts per channel */
|
||||
#define R_IMF_CHAN_DEPTH_1 (1 << 0) /* 1bits (unused) */
|
||||
#define R_IMF_CHAN_DEPTH_8 (1 << 1) /* 8bits (default) */
|
||||
#define R_IMF_CHAN_DEPTH_10 (1 << 2) /* 10bits (uncommon, Cineon/DPX support) */
|
||||
#define R_IMF_CHAN_DEPTH_12 (1 << 3) /* 12bits (uncommon, jp2/DPX support) */
|
||||
#define R_IMF_CHAN_DEPTH_16 (1 << 4) /* 16bits (tiff, halff float exr) */
|
||||
#define R_IMF_CHAN_DEPTH_24 (1 << 5) /* 24bits (unused) */
|
||||
#define R_IMF_CHAN_DEPTH_32 (1 << 6) /* 32bits (full float exr) */
|
||||
/* ImageFormatData.depth */
|
||||
typedef enum eImageFormatDepth {
|
||||
/* 1bits (unused) */
|
||||
R_IMF_CHAN_DEPTH_1 = (1 << 0),
|
||||
/* 8bits (default) */
|
||||
R_IMF_CHAN_DEPTH_8 = (1 << 1),
|
||||
/* 10bits (uncommon, Cineon/DPX support) */
|
||||
R_IMF_CHAN_DEPTH_10 = (1 << 2),
|
||||
/* 12bits (uncommon, jp2/DPX support) */
|
||||
R_IMF_CHAN_DEPTH_12 = (1 << 3),
|
||||
/* 16bits (tiff, half float exr) */
|
||||
R_IMF_CHAN_DEPTH_16 = (1 << 4),
|
||||
/* 24bits (unused) */
|
||||
R_IMF_CHAN_DEPTH_24 = (1 << 5),
|
||||
/* 32bits (full float exr) */
|
||||
R_IMF_CHAN_DEPTH_32 = (1 << 6),
|
||||
} eImageFormatDepth;
|
||||
|
||||
/* ImageFormatData.planes */
|
||||
#define R_IMF_PLANES_RGB 24
|
||||
|
|
Loading…
Reference in New Issue