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:
Mai Lavelle 2016-04-17 20:15:50 +02:00 committed by Brecht Van Lommel
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
5 changed files with 72 additions and 15 deletions

View File

@ -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,
)

View File

@ -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"

View File

@ -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);

View File

@ -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;

View File

@ -172,6 +172,8 @@ private:
bool experimental;
bool is_cpu;
float dicing_rate;
struct RenderLayerInfo {
RenderLayerInfo()
: scene_layer(0), layer(0),