Fix T74811: GreasePencil Stereo Rendering
When using grease pencil in a stereo rendering the grease pencil objects are only visible in the left eye. In the viewport it renders both. Issue is related that `DRW_render_gpencil` only renders a single view. But `DRW_render_to_image` renders all views. This patch puts this in a loop to render both eyes. Reviewed By: fclem Differential Revision: https://developer.blender.org/D7154
This commit is contained in:
parent
4fc45c7a2b
commit
8ba9efb7d8
Notes:
blender-bot
2023-02-14 11:29:52 +01:00
Referenced by issue #74811, GreasePencil Stereo Render renders to one eye only
|
@ -104,10 +104,21 @@ void GPENCIL_render_init(GPENCIL_Data *vedata,
|
|||
|
||||
/* FIXME(fclem): we have a precision loss in the depth buffer because of this reupload.
|
||||
* Find where it comes from! */
|
||||
txl->render_depth_tx = DRW_texture_create_2d(
|
||||
size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z);
|
||||
txl->render_color_tx = DRW_texture_create_2d(
|
||||
size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col);
|
||||
/* In multi view render the textures can be reused. */
|
||||
if (txl->render_depth_tx && !do_clear_z) {
|
||||
GPU_texture_update(txl->render_depth_tx, GPU_DATA_FLOAT, pix_z);
|
||||
}
|
||||
else {
|
||||
txl->render_depth_tx = DRW_texture_create_2d(
|
||||
size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z);
|
||||
}
|
||||
if (txl->render_color_tx && !do_clear_col) {
|
||||
GPU_texture_update(txl->render_color_tx, GPU_DATA_FLOAT, pix_col);
|
||||
}
|
||||
else {
|
||||
txl->render_color_tx = DRW_texture_create_2d(
|
||||
size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col);
|
||||
}
|
||||
|
||||
GPU_framebuffer_ensure_config(&fbl->render_fb,
|
||||
{
|
||||
|
|
|
@ -1627,6 +1627,13 @@ bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
|
|||
return false;
|
||||
}
|
||||
|
||||
static void drw_view_reset(void)
|
||||
{
|
||||
DST.view_default = NULL;
|
||||
DST.view_active = NULL;
|
||||
DST.view_previous = NULL;
|
||||
}
|
||||
|
||||
static void DRW_render_gpencil_to_image(RenderEngine *engine,
|
||||
struct RenderLayer *render_layer,
|
||||
const rcti *rect)
|
||||
|
@ -1701,10 +1708,13 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
|
|||
|
||||
RenderResult *render_result = RE_engine_get_result(engine);
|
||||
RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
|
||||
|
||||
DST.buffer_finish_called = false;
|
||||
|
||||
DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
|
||||
for (RenderView *render_view = render_result->views.first; render_view != NULL;
|
||||
render_view = render_view->next) {
|
||||
RE_SetActiveRenderView(render, render_view->name);
|
||||
drw_view_reset();
|
||||
DST.buffer_finish_called = false;
|
||||
DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
|
||||
}
|
||||
|
||||
/* Force cache to reset. */
|
||||
drw_viewport_cache_resize();
|
||||
|
@ -1728,13 +1738,6 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
|
|||
DST.buffer_finish_called = false;
|
||||
}
|
||||
|
||||
static void drw_view_reset(void)
|
||||
{
|
||||
DST.view_default = NULL;
|
||||
DST.view_active = NULL;
|
||||
DST.view_previous = NULL;
|
||||
}
|
||||
|
||||
void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
|
||||
{
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
|
|
Loading…
Reference in New Issue