Cycles microdisplacement: scene level render and preview dicing rates
This makes it easier to control overall dicing rate without having to tweak every object. The preview rate makes viewport editing more interactive. The default preview rate of 8 is roughly 64 times faster for some operations. Reviewed By: brecht Differential Revision: https://developer.blender.org/D1919
This commit is contained in:
parent
facc127e72
commit
9f39619dda
Notes:
blender-bot
2023-02-14 12:01:57 +01:00
Referenced by issue #48191, Particle hair viewport colour only updates if 'material_slot' material is re-selected Referenced by issue #48192, Cursor remains a 'double headed arrow' when opening the 'Add Node' menu. Referenced by issue #48193, Incorrect api documentation for 'keyframe_insert' optional flags
|
@ -370,6 +370,19 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
|||
min=2, max=65536
|
||||
)
|
||||
|
||||
cls.dicing_rate = FloatProperty(
|
||||
name="Dicing Rate",
|
||||
description="Size of a micropolygon in pixels",
|
||||
min=0.1, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
cls.preview_dicing_rate = FloatProperty(
|
||||
name="Preview Dicing Rate",
|
||||
description="Size of a micropolygon in pixels during preview render",
|
||||
min=0.1, max=1000.0,
|
||||
default=8.0,
|
||||
)
|
||||
|
||||
cls.film_exposure = FloatProperty(
|
||||
name="Exposure",
|
||||
description="Image brightness scale",
|
||||
|
@ -945,7 +958,7 @@ class CyclesMeshSettings(bpy.types.PropertyGroup):
|
|||
)
|
||||
cls.dicing_rate = FloatProperty(
|
||||
name="Dicing Rate",
|
||||
description="Size of a micropolygon in pixels",
|
||||
description="Multiplier for scene dicing rate",
|
||||
min=0.1, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
|
|
|
@ -209,8 +209,8 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
|||
draw_samples_info(layout, context)
|
||||
|
||||
|
||||
class CyclesRender_PT_volume_sampling(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume Sampling"
|
||||
class CyclesRender_PT_geometery(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Geometry"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
def draw(self, context):
|
||||
|
@ -219,11 +219,28 @@ class CyclesRender_PT_volume_sampling(CyclesButtonsPanel, Panel):
|
|||
scene = context.scene
|
||||
cscene = scene.cycles
|
||||
|
||||
row = layout.row()
|
||||
row.label("Heterogeneous:")
|
||||
row = layout.row()
|
||||
row.prop(cscene, "volume_step_size")
|
||||
row.prop(cscene, "volume_max_steps")
|
||||
if cscene.feature_set == 'EXPERIMENTAL':
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
|
||||
sub = col.column(align=True)
|
||||
sub.label("Volume Sampling:")
|
||||
sub.prop(cscene, "volume_step_size")
|
||||
sub.prop(cscene, "volume_max_steps")
|
||||
|
||||
col = split.column()
|
||||
|
||||
sub = col.column(align=True)
|
||||
sub.label("Subdivision Rate:")
|
||||
sub.prop(cscene, "dicing_rate", text="Render")
|
||||
sub.prop(cscene, "preview_dicing_rate", text="Preview")
|
||||
else:
|
||||
row = layout.row()
|
||||
row.label("Volume Sampling:")
|
||||
row = layout.row()
|
||||
row.prop(cscene, "volume_step_size")
|
||||
row.prop(cscene, "volume_max_steps")
|
||||
|
||||
|
||||
class CyclesRender_PT_light_paths(CyclesButtonsPanel, Panel):
|
||||
|
@ -694,8 +711,7 @@ class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
|
|||
sub.prop(cdata, "subdivision_type", text="")
|
||||
|
||||
if cdata.subdivision_type != 'NONE':
|
||||
sub.label(text="Subdivision Rate:")
|
||||
sub.prop(cdata, "dicing_rate", text="Render")
|
||||
sub.prop(cdata, "dicing_rate")
|
||||
|
||||
class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Motion Blur"
|
||||
|
|
|
@ -660,13 +660,14 @@ static void create_subd_mesh(Scene *scene,
|
|||
BL::Object b_ob,
|
||||
BL::Mesh& b_mesh,
|
||||
PointerRNA *cmesh,
|
||||
const vector<uint>& used_shaders)
|
||||
const vector<uint>& used_shaders,
|
||||
float dicing_rate)
|
||||
{
|
||||
Mesh basemesh;
|
||||
create_mesh(scene, &basemesh, b_mesh, used_shaders);
|
||||
|
||||
SubdParams sdparams(mesh, used_shaders[0], true, false);
|
||||
sdparams.dicing_rate = RNA_float_get(cmesh, "dicing_rate");
|
||||
sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate);
|
||||
|
||||
scene->camera->update();
|
||||
sdparams.camera = scene->camera;
|
||||
|
@ -783,7 +784,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
|
|||
if(b_mesh) {
|
||||
if(render_layer.use_surfaces && !hide_tris) {
|
||||
if(cmesh.data && experimental && RNA_enum_get(&cmesh, "subdivision_type"))
|
||||
create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders);
|
||||
create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders, dicing_rate);
|
||||
else
|
||||
create_mesh(scene, mesh, b_mesh, used_shaders);
|
||||
|
||||
|
|
|
@ -63,8 +63,11 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
|
|||
preview(preview),
|
||||
experimental(false),
|
||||
is_cpu(is_cpu),
|
||||
dicing_rate(1.0f),
|
||||
progress(progress)
|
||||
{
|
||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||
dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate") : RNA_float_get(&cscene, "dicing_rate");
|
||||
}
|
||||
|
||||
BlenderSync::~BlenderSync()
|
||||
|
@ -124,11 +127,33 @@ bool BlenderSync::sync_recalc()
|
|||
}
|
||||
}
|
||||
|
||||
bool dicing_rate_changed = false;
|
||||
|
||||
if(experimental) {
|
||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||
float updated_dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate")
|
||||
: RNA_float_get(&cscene, "dicing_rate");
|
||||
|
||||
if(dicing_rate != updated_dicing_rate) {
|
||||
dicing_rate = updated_dicing_rate;
|
||||
dicing_rate_changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
BL::BlendData::meshes_iterator b_mesh;
|
||||
|
||||
for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh)
|
||||
if(b_mesh->is_updated())
|
||||
for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh) {
|
||||
if(b_mesh->is_updated()) {
|
||||
mesh_map.set_recalc(*b_mesh);
|
||||
}
|
||||
else if(dicing_rate_changed) {
|
||||
PointerRNA cmesh = RNA_pointer_get(&b_mesh->ptr, "cycles");
|
||||
|
||||
if(RNA_enum_get(&cmesh, "subdivision_type"))
|
||||
mesh_map.set_recalc(*b_mesh);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BL::BlendData::worlds_iterator b_world;
|
||||
|
||||
|
|
|
@ -172,6 +172,8 @@ private:
|
|||
bool experimental;
|
||||
bool is_cpu;
|
||||
|
||||
float dicing_rate;
|
||||
|
||||
struct RenderLayerInfo {
|
||||
RenderLayerInfo()
|
||||
: scene_layer(0), layer(0),
|
||||
|
|
Loading…
Reference in New Issue