[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43693] trunk/blender: Cycles: Render Passes
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Jan 25 18:24:02 CET 2012
Revision: 43693
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43693
Author: blendix
Date: 2012-01-25 17:23:52 +0000 (Wed, 25 Jan 2012)
Log Message:
-----------
Cycles: Render Passes
Currently supported passes:
* Combined, Z, Normal, Object Index, Material Index, Emission, Environment,
Diffuse/Glossy/Transmission x Direct/Indirect/Color
Not supported yet:
* UV, Vector, Mist
Only enabled for CPU devices at the moment, will do GPU tweaks tommorrow,
also for environment importance sampling.
Documentation:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Passes
Modified Paths:
--------------
trunk/blender/intern/cycles/blender/addon/ui.py
trunk/blender/intern/cycles/blender/blender_object.cpp
trunk/blender/intern/cycles/blender/blender_session.cpp
trunk/blender/intern/cycles/blender/blender_shader.cpp
trunk/blender/intern/cycles/device/device_cpu.cpp
trunk/blender/intern/cycles/kernel/CMakeLists.txt
trunk/blender/intern/cycles/kernel/kernel.cl
trunk/blender/intern/cycles/kernel/kernel.cpp
trunk/blender/intern/cycles/kernel/kernel.cu
trunk/blender/intern/cycles/kernel/kernel.h
trunk/blender/intern/cycles/kernel/kernel_emission.h
trunk/blender/intern/cycles/kernel/kernel_film.h
trunk/blender/intern/cycles/kernel/kernel_object.h
trunk/blender/intern/cycles/kernel/kernel_optimized.cpp
trunk/blender/intern/cycles/kernel/kernel_path.h
trunk/blender/intern/cycles/kernel/kernel_random.h
trunk/blender/intern/cycles/kernel/kernel_shader.h
trunk/blender/intern/cycles/kernel/kernel_types.h
trunk/blender/intern/cycles/kernel/svm/svm_types.h
trunk/blender/intern/cycles/render/buffers.cpp
trunk/blender/intern/cycles/render/buffers.h
trunk/blender/intern/cycles/render/film.cpp
trunk/blender/intern/cycles/render/film.h
trunk/blender/intern/cycles/render/object.cpp
trunk/blender/intern/cycles/render/object.h
trunk/blender/intern/cycles/render/shader.cpp
trunk/blender/intern/cycles/render/shader.h
trunk/blender/source/blender/blenkernel/BKE_node.h
trunk/blender/source/blender/makesdna/DNA_scene_types.h
trunk/blender/source/blender/makesrna/intern/rna_render.c
trunk/blender/source/blender/makesrna/intern/rna_scene.c
trunk/blender/source/blender/nodes/composite/node_composite_tree.c
trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c
trunk/blender/source/blender/render/intern/source/render_result.c
Added Paths:
-----------
trunk/blender/intern/cycles/kernel/kernel_accumulate.h
trunk/blender/intern/cycles/kernel/kernel_passes.h
Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/addon/ui.py 2012-01-25 17:23:52 UTC (rev 43693)
@@ -183,6 +183,38 @@
layout.separator()
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Passes:")
+ col.prop(rl, "use_pass_combined")
+ col.prop(rl, "use_pass_z")
+ col.prop(rl, "use_pass_normal")
+ col.prop(rl, "use_pass_object_index")
+ col.prop(rl, "use_pass_material_index")
+ col.prop(rl, "use_pass_emit")
+ col.prop(rl, "use_pass_environment")
+
+ col = split.column()
+ col.label()
+ col.label(text="Diffuse:")
+ row = col.row(align=True)
+ row.prop(rl, "use_pass_diffuse_direct", text="Direct", toggle=True)
+ row.prop(rl, "use_pass_diffuse_indirect", text="Indirect", toggle=True)
+ row.prop(rl, "use_pass_diffuse_color", text="Color", toggle=True)
+ col.label(text="Glossy:")
+ row = col.row(align=True)
+ row.prop(rl, "use_pass_glossy_direct", text="Direct", toggle=True)
+ row.prop(rl, "use_pass_glossy_indirect", text="Indirect", toggle=True)
+ row.prop(rl, "use_pass_glossy_color", text="Color", toggle=True)
+ col.label(text="Transmission:")
+ row = col.row(align=True)
+ row.prop(rl, "use_pass_transmission_direct", text="Direct", toggle=True)
+ row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
+ row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
+
+ layout.separator()
+
rl = rd.layers[0]
layout.prop(rl, "material_override", text="Material")
Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp 2012-01-25 17:23:52 UTC (rev 43693)
@@ -214,6 +214,7 @@
/* object sync */
if(object_updated || (object->mesh && object->mesh->need_update)) {
object->name = b_ob.name().c_str();
+ object->pass_id = b_ob.pass_index();
object->tfm = tfm;
/* visibility flags for both parent */
Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp 2012-01-25 17:23:52 UTC (rev 43693)
@@ -116,9 +116,68 @@
delete session;
}
+static PassType get_pass_type(BL::RenderPass b_pass)
+{
+ switch(b_pass.type()) {
+ case BL::RenderPass::type_COMBINED:
+ return PASS_COMBINED;
+
+ case BL::RenderPass::type_Z:
+ return PASS_DEPTH;
+ case BL::RenderPass::type_NORMAL:
+ return PASS_NORMAL;
+ case BL::RenderPass::type_OBJECT_INDEX:
+ return PASS_OBJECT_ID;
+ case BL::RenderPass::type_UV:
+ return PASS_UV;
+ case BL::RenderPass::type_MATERIAL_INDEX:
+ return PASS_MATERIAL_ID;
+
+ case BL::RenderPass::type_DIFFUSE_DIRECT:
+ return PASS_DIFFUSE_DIRECT;
+ case BL::RenderPass::type_GLOSSY_DIRECT:
+ return PASS_GLOSSY_DIRECT;
+ case BL::RenderPass::type_TRANSMISSION_DIRECT:
+ return PASS_TRANSMISSION_DIRECT;
+
+ case BL::RenderPass::type_DIFFUSE_INDIRECT:
+ return PASS_DIFFUSE_INDIRECT;
+ case BL::RenderPass::type_GLOSSY_INDIRECT:
+ return PASS_GLOSSY_INDIRECT;
+ case BL::RenderPass::type_TRANSMISSION_INDIRECT:
+ return PASS_TRANSMISSION_INDIRECT;
+
+ case BL::RenderPass::type_DIFFUSE_COLOR:
+ return PASS_DIFFUSE_COLOR;
+ case BL::RenderPass::type_GLOSSY_COLOR:
+ return PASS_GLOSSY_COLOR;
+ case BL::RenderPass::type_TRANSMISSION_COLOR:
+ return PASS_TRANSMISSION_COLOR;
+
+ case BL::RenderPass::type_EMIT:
+ return PASS_EMISSION;
+ case BL::RenderPass::type_ENVIRONMENT:
+ return PASS_BACKGROUND;
+
+ case BL::RenderPass::type_DIFFUSE:
+ case BL::RenderPass::type_SHADOW:
+ case BL::RenderPass::type_AO:
+ case BL::RenderPass::type_COLOR:
+ case BL::RenderPass::type_REFRACTION:
+ case BL::RenderPass::type_SPECULAR:
+ case BL::RenderPass::type_REFLECTION:
+ case BL::RenderPass::type_VECTOR:
+ case BL::RenderPass::type_MIST:
+ return PASS_NONE;
+ }
+
+ return PASS_NONE;
+}
+
void BlenderSession::render()
{
/* get buffer parameters */
+ SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
int w = buffer_params.width, h = buffer_params.height;
@@ -143,6 +202,25 @@
/* set layer */
b_rlay = *b_iter;
+ /* add passes */
+ if(session_params.device.type == DEVICE_CPU) { /* todo */
+ BL::RenderLayer::passes_iterator b_pass_iter;
+
+ for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) {
+ BL::RenderPass b_pass(*b_pass_iter);
+ PassType pass_type = get_pass_type(b_pass);
+
+ if(pass_type != PASS_NONE)
+ Pass::add(pass_type, buffer_params.passes);
+ }
+ }
+
+ scene->film->passes = buffer_params.passes;
+ scene->film->need_update = true;
+
+ /* update session */
+ session->reset(buffer_params, session_params.samples);
+
/* update scene */
sync->sync_data(b_v3d, active);
@@ -165,22 +243,41 @@
{
/* get state */
RenderBuffers *buffers = session->buffers;
+
+ /* copy data from device */
+ if(!buffers->copy_from_device())
+ return;
+
+ BufferParams& params = buffers->params;
float exposure = scene->film->exposure;
double total_time, sample_time;
int sample;
+
session->progress.get_sample(sample, total_time, sample_time);
- /* get pixels */
- float4 *pixels = buffers->copy_from_device(exposure, sample);
+ vector<float> pixels(params.width*params.height*4);
- if(!pixels)
- return;
+ /* copy each pass */
+ BL::RenderLayer::passes_iterator b_iter;
+
+ for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
+ BL::RenderPass b_pass(*b_iter);
- /* write pixels */
- rna_RenderLayer_rect_set(&b_rlay.ptr, (float*)pixels);
+ /* find matching pass type */
+ PassType pass_type = get_pass_type(b_pass);
+ int components = b_pass.channels();
+
+ /* copy pixels */
+ if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
+ rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
+ }
+
+ /* copy combined pass */
+ if(buffers->get_pass(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+ rna_RenderLayer_rect_set(&b_rlay.ptr, &pixels[0]);
+
+ /* tag result as updated */
RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
-
- delete [] pixels;
}
void BlenderSession::synchronize()
Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp 2012-01-25 17:23:52 UTC (rev 43693)
@@ -636,6 +636,7 @@
ShaderGraph *graph = new ShaderGraph();
shader->name = b_mat->name().c_str();
+ shader->pass_id = b_mat->pass_index();
/* create nodes */
if(b_mat->use_nodes() && b_mat->node_tree()) {
Modified: trunk/blender/intern/cycles/device/device_cpu.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cpu.cpp 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/device/device_cpu.cpp 2012-01-25 17:23:52 UTC (rev 43693)
@@ -162,7 +162,7 @@
if(system_cpu_support_optimized()) {
for(int y = task.y; y < task.y + task.h; y++) {
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_optimized_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+ kernel_cpu_optimized_path_trace(kg, (float*)task.buffer, (unsigned int*)task.rng_state,
task.sample, x, y, task.offset, task.stride);
if(tasks.worker_cancel())
@@ -174,7 +174,7 @@
{
for(int y = task.y; y < task.y + task.h; y++) {
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+ kernel_cpu_path_trace(kg, (float*)task.buffer, (unsigned int*)task.rng_state,
task.sample, x, y, task.offset, task.stride);
if(tasks.worker_cancel())
@@ -194,7 +194,7 @@
if(system_cpu_support_optimized()) {
for(int y = task.y; y < task.y + task.h; y++)
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+ kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
task.sample, task.resolution, x, y, task.offset, task.stride);
}
else
@@ -202,7 +202,7 @@
{
for(int y = task.y; y < task.y + task.h; y++)
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+ kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
task.sample, task.resolution, x, y, task.offset, task.stride);
}
}
Modified: trunk/blender/intern/cycles/kernel/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/kernel/CMakeLists.txt 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/kernel/CMakeLists.txt 2012-01-25 17:23:52 UTC (rev 43693)
@@ -15,6 +15,7 @@
set(SRC_HEADERS
kernel.h
+ kernel_accumulate.h
kernel_bvh.h
kernel_camera.h
kernel_compat_cpu.h
@@ -30,6 +31,7 @@
kernel_mbvh.h
kernel_montecarlo.h
kernel_object.h
+ kernel_passes.h
kernel_path.h
kernel_qbvh.h
kernel_random.h
Modified: trunk/blender/intern/cycles/kernel/kernel.cl
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel.cl 2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/kernel/kernel.cl 2012-01-25 17:23:52 UTC (rev 43693)
@@ -28,7 +28,7 @@
__kernel void kernel_ocl_path_trace(
__constant KernelData *data,
- __global float4 *buffer,
+ __global float *buffer,
__global uint *rng_state,
#define KERNEL_TEX(type, ttype, name) \
@@ -56,7 +56,7 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list