diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2016-04-18 23:35:49 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-04-18 23:47:24 +0300 |
commit | 3068ea34e414e7af6d20af7ab92c69cbd9a33414 (patch) | |
tree | e820479e09c3959219a16e8346c766be3d61f22d /intern/cycles/blender | |
parent | 71588300d233f795fcf9b0b55ce397b9b81614ff (diff) |
Cycles microdisplacement: add max subdivision setting
This is to prevent situations such as when the camera gets very close to a mesh
and causes it to be tessellated into an excessive amount of micropolygons. In
REYES this is known as the eye-splits problem.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D1922
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r-- | intern/cycles/blender/addon/properties.py | 7 | ||||
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 2 | ||||
-rw-r--r-- | intern/cycles/blender/blender_mesh.cpp | 7 | ||||
-rw-r--r-- | intern/cycles/blender/blender_sync.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/blender/blender_sync.h | 1 |
5 files changed, 28 insertions, 5 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index d65718f6e19..a5887bb9e2d 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -383,6 +383,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): default=8.0, ) + cls.max_subdivisions = IntProperty( + name="Max Subdivisions", + description="Stop subdividing when this level is reached even if the dice rate would produce finer tessellation", + min=0, max=16, + default=12, + ) + cls.film_exposure = FloatProperty( name="Exposure", description="Image brightness scale", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index afad3b83983..a4e6809390d 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -235,6 +235,8 @@ class CyclesRender_PT_geometery(CyclesButtonsPanel, Panel): sub.label("Subdivision Rate:") sub.prop(cscene, "dicing_rate", text="Render") sub.prop(cscene, "preview_dicing_rate", text="Preview") + sub.separator() + sub.prop(cscene, "max_subdivisions") else: row = layout.row() row.label("Volume Sampling:") diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index ba0ba7892e8..09e27c2282d 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -661,13 +661,15 @@ static void create_subd_mesh(Scene *scene, BL::Mesh& b_mesh, PointerRNA *cmesh, const vector<uint>& used_shaders, - float dicing_rate) + float dicing_rate, + int max_subdivisions) { Mesh basemesh; create_mesh(scene, &basemesh, b_mesh, used_shaders); SubdParams sdparams(mesh, used_shaders[0], true, false); sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate); + sdparams.max_level = max_subdivisions; scene->camera->update(); sdparams.camera = scene->camera; @@ -784,7 +786,8 @@ 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, dicing_rate); + create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders, + dicing_rate, max_subdivisions); else create_mesh(scene, mesh, b_mesh, used_shaders); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 803a997ca6e..6291b38d462 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -64,10 +64,12 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine, experimental(false), is_cpu(is_cpu), dicing_rate(1.0f), + max_subdivisions(12), 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"); + max_subdivisions = RNA_int_get(&cscene, "max_subdivisions"); } BlenderSync::~BlenderSync() @@ -127,16 +129,24 @@ bool BlenderSync::sync_recalc() } } - bool dicing_rate_changed = false; + bool dicing_prop_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; + dicing_prop_changed = true; + } + + int updated_max_subdivisions = RNA_int_get(&cscene, "max_subdivisions"); + + if(max_subdivisions != updated_max_subdivisions) { + max_subdivisions = updated_max_subdivisions; + dicing_prop_changed = true; } } @@ -146,7 +156,7 @@ bool BlenderSync::sync_recalc() if(b_mesh->is_updated()) { mesh_map.set_recalc(*b_mesh); } - else if(dicing_rate_changed) { + else if(dicing_prop_changed) { PointerRNA cmesh = RNA_pointer_get(&b_mesh->ptr, "cycles"); if(RNA_enum_get(&cmesh, "subdivision_type")) diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index 4918b7871f8..6ff5326f39f 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -173,6 +173,7 @@ private: bool is_cpu; float dicing_rate; + int max_subdivisions; struct RenderLayerInfo { RenderLayerInfo() |