Implement transparent background for Storm delegate #71

Merged
Bogdan Nagirniak merged 3 commits from Vasyl-Pidhirskyi/blender_bn:BLEN-463 into hydra-render 2023-07-23 21:03:02 +02:00
4 changed files with 13 additions and 7 deletions

View File

@ -109,7 +109,7 @@ void FinalEngine::prepare_for_render(Depsgraph *depsgraph)
if (light_tasks_delegate_) { if (light_tasks_delegate_) {
light_tasks_delegate_->set_camera_and_viewport( light_tasks_delegate_->set_camera_and_viewport(
free_camera_delegate_->GetCameraId(), pxr::GfVec4d(0, 0, resolution_[0], resolution_[1])); free_camera_delegate_->GetCameraId(), pxr::GfVec4d(0, 0, resolution_[0], resolution_[1]));
tasks_ = light_tasks_delegate_->get_tasks(); tasks_ = light_tasks_delegate_->get_tasks(scene->r.alphamode == R_ALPHAPREMUL);
} }
tasks_.push_back(render_task_delegate_->get_task()); tasks_.push_back(render_task_delegate_->get_task());
@ -147,7 +147,7 @@ void FinalEngineGPU::render(Depsgraph *depsgraph)
GPU_framebuffer_bind(framebuffer); GPU_framebuffer_bind(framebuffer);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f}; float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
GPU_framebuffer_clear_color_depth(framebuffer, clear_color, 1.0f); GPU_framebuffer_clear_color_depth(framebuffer, clear_color, 1.0f);

View File

@ -18,12 +18,17 @@ LightTasksDelegate::LightTasksDelegate(pxr::HdRenderIndex *parent_index,
GetRenderIndex().InsertTask<pxr::HdxSimpleLightTask>(this, simple_task_id_); GetRenderIndex().InsertTask<pxr::HdxSimpleLightTask>(this, simple_task_id_);
} }
pxr::HdTaskSharedPtrVector LightTasksDelegate::get_tasks() pxr::HdTaskSharedPtrVector LightTasksDelegate::get_tasks(const bool isTransparent)
{ {
/*Note that this task is intended to be the first "Render Task", /*Note that this task is intended to be the first "Render Task",
so that the AOV's are properly cleared, however it so that the AOV's are properly cleared, however it
does not spawn a HdRenderPass.*/ does not spawn a HdRenderPass.*/
return {GetRenderIndex().GetTask(skydome_task_id_), GetRenderIndex().GetTask(simple_task_id_)}; pxr::HdTaskSharedPtrVector tasks;
if (!isTransparent) {
tasks.push_back(GetRenderIndex().GetTask(skydome_task_id_));
}
tasks.push_back(GetRenderIndex().GetTask(simple_task_id_));
return tasks;
} }
void LightTasksDelegate::set_camera_and_viewport(pxr::SdfPath const &camera_id, void LightTasksDelegate::set_camera_and_viewport(pxr::SdfPath const &camera_id,

View File

@ -14,7 +14,7 @@ class LightTasksDelegate : public pxr::HdSceneDelegate {
LightTasksDelegate(pxr::HdRenderIndex *parentIndex, pxr::SdfPath const &delegate_id); LightTasksDelegate(pxr::HdRenderIndex *parentIndex, pxr::SdfPath const &delegate_id);
~LightTasksDelegate() override = default; ~LightTasksDelegate() override = default;
pxr::HdTaskSharedPtrVector get_tasks(); pxr::HdTaskSharedPtrVector get_tasks(const bool isTransparent);
void set_camera_and_viewport(pxr::SdfPath const &camera_id, pxr::GfVec4d const &viewport); void set_camera_and_viewport(pxr::SdfPath const &camera_id, pxr::GfVec4d const &viewport);
/* Delegate methods */ /* Delegate methods */

View File

@ -222,9 +222,10 @@ void ViewportEngine::render(Depsgraph * /* depsgraph */)
/* Empty function */ /* Empty function */
} }
void ViewportEngine::render(Depsgraph * /* depsgraph */, bContext *context) void ViewportEngine::render(Depsgraph *depsgraph, bContext *context)
{ {
ViewSettings view_settings(context); ViewSettings view_settings(context);
const Scene *scene = DEG_get_evaluated_scene(depsgraph);
if (view_settings.width() * view_settings.height() == 0) { if (view_settings.width() * view_settings.height() == 0) {
return; return;
}; };
@ -254,7 +255,7 @@ void ViewportEngine::render(Depsgraph * /* depsgraph */, bContext *context)
pxr::HdTaskSharedPtrVector tasks; pxr::HdTaskSharedPtrVector tasks;
if (light_tasks_delegate_) { if (light_tasks_delegate_) {
tasks = light_tasks_delegate_->get_tasks(); tasks = light_tasks_delegate_->get_tasks(scene->r.alphamode == R_ALPHAPREMUL);
} }
tasks.push_back(render_task_delegate_->get_task()); tasks.push_back(render_task_delegate_->get_task());