[Bf-blender-cvs] [e9e72fee1c9] soc-2022-many-lights-sampling: Cleanup: reduce the size of `KernelLightTreeEmitter`
Weizhen Huang
noreply at git.blender.org
Tue Nov 22 14:51:30 CET 2022
Commit: e9e72fee1c985737afa6ef9ae51be0ad4a1900d7
Author: Weizhen Huang
Date: Tue Nov 22 14:50:36 2022 +0100
Branches: soc-2022-many-lights-sampling
https://developer.blender.org/rBe9e72fee1c985737afa6ef9ae51be0ad4a1900d7
Cleanup: reduce the size of `KernelLightTreeEmitter`
===================================================================
M intern/cycles/kernel/light/tree.h
M intern/cycles/kernel/types.h
M intern/cycles/scene/light.cpp
M intern/cycles/scene/shader.h
===================================================================
diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h
index 58c51c529b3..c762f2b4cbf 100644
--- a/intern/cycles/kernel/light/tree.h
+++ b/intern/cycles/kernel/light/tree.h
@@ -181,24 +181,23 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
ccl_global const KernelLightTreeEmitter *kemitter = &kernel_data_fetch(light_tree_emitters,
emitter_index);
- float3 bcone_axis = make_float3(kemitter->bounding_cone_axis[0],
- kemitter->bounding_cone_axis[1],
- kemitter->bounding_cone_axis[2]);
float theta_o = kemitter->theta_o;
float min_distance, distance;
float max_distance = 0.0f;
float cos_theta_u = 1.0f;
- float3 centroid = make_float3(
- kemitter->centroid[0], kemitter->centroid[1], kemitter->centroid[2]);
- float3 point_to_centroid = safe_normalize_len(centroid - P, &distance);
+ float3 bcone_axis, centroid, point_to_centroid;
bool bbox_is_visible = has_transmission;
const int prim = kemitter->prim_id;
+ /* TODO: pack in functions and move to header files for respective light types */
if (prim < 0) {
const int lamp = -prim - 1;
const ccl_global KernelLight *klight = &kernel_data_fetch(lights, lamp);
+ centroid = make_float3(klight->co[0], klight->co[1], klight->co[2]);
+ point_to_centroid = safe_normalize_len(centroid - P, &distance);
if (klight->type == LIGHT_SPOT || klight->type == LIGHT_POINT) {
+ bcone_axis = make_float3(klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
const float radius = klight->spot.radius;
min_distance = distance;
max_distance = sqrtf(sqr(radius) + sqr(distance));
@@ -207,6 +206,7 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
bbox_is_visible = true; /* will be tested later */
}
else { /* area light */
+ bcone_axis = make_float3(klight->area.dir[0], klight->area.dir[1], klight->area.dir[2]);
const float3 extentu = make_float3(
klight->area.extentu[0], klight->area.extentu[1], klight->area.extentu[2]);
const float3 extentv = make_float3(
@@ -231,10 +231,21 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
}
else { /* mesh light */
const int object = kemitter->mesh_light.object_id;
- float3 V[3];
- triangle_world_space_vertices(kg, object, prim, -1.0f, V);
+ float3 vertices[3];
+ triangle_world_space_vertices(kg, object, prim, -1.0f, vertices);
+ centroid = (vertices[0] + vertices[1] + vertices[2]) / 3.0f;
+ point_to_centroid = safe_normalize_len(centroid - P, &distance);
+ bcone_axis = safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
+ if (kemitter->mesh_light.emission_sampling == EMISSION_SAMPLING_BACK) {
+ bcone_axis = -bcone_axis;
+ }
+ else if (kemitter->mesh_light.emission_sampling == EMISSION_SAMPLING_FRONT_BACK) {
+ bcone_axis *= -signf(dot(bcone_axis, point_to_centroid));
+ }
+ theta_o = 0.0f;
+
for (int i = 0; i < 3; i++) {
- const float3 corner = V[i];
+ const float3 corner = vertices[i];
float distance_point_to_corner;
const float3 point_to_corner = safe_normalize_len(corner - P, &distance_point_to_corner);
cos_theta_u = fminf(cos_theta_u, dot(point_to_centroid, point_to_corner));
diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h
index 683dc26748c..d2719dedae2 100644
--- a/intern/cycles/kernel/types.h
+++ b/intern/cycles/kernel/types.h
@@ -467,6 +467,16 @@ typedef enum ShaderFlag {
SHADER_EXCLUDE_ANY)
} ShaderFlag;
+enum EmissionSampling {
+ EMISSION_SAMPLING_NONE = 0,
+ EMISSION_SAMPLING_AUTO = 1,
+ EMISSION_SAMPLING_FRONT = 2,
+ EMISSION_SAMPLING_BACK = 3,
+ EMISSION_SAMPLING_FRONT_BACK = 4,
+
+ EMISSION_SAMPLING_NUM
+};
+
/* Light Type */
typedef enum LightType {
@@ -1364,10 +1374,7 @@ typedef struct KernelLightTreeNode {
static_assert_align(KernelLightTreeNode, 16);
typedef struct KernelLightTreeEmitter {
- float centroid[3];
-
/* Bounding cone. */
- float bounding_cone_axis[3];
float theta_o;
float theta_e;
@@ -1376,22 +1383,14 @@ typedef struct KernelLightTreeEmitter {
/* prim_id denotes the location in the lights or triangles array. */
int prim_id;
- union {
- struct {
- int shader_flag;
- int object_id;
- } mesh_light;
- struct {
- float pad1;
- float size;
- } lamp;
- };
+ struct {
+ int shader_flag;
+ int object_id;
+ EmissionSampling emission_sampling;
+ } mesh_light;
/* Parent. */
int parent_index;
-
- /* Padding */
- float pad3[3];
} KernelLightTreeEmitter;
static_assert_align(KernelLightTreeEmitter, 16);
diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp
index b2d85256523..970c8b78201 100644
--- a/intern/cycles/scene/light.cpp
+++ b/intern/cycles/scene/light.cpp
@@ -604,11 +604,6 @@ void LightManager::device_update_tree(Device *device,
LightTreePrimitive &prim = light_prims[emitter_index];
light_tree_emitters[emitter_index].energy = prim.energy;
-
- for (int i = 0; i < 3; i++) {
- light_tree_emitters[emitter_index].centroid[i] = prim.centroid[i];
- light_tree_emitters[emitter_index].bounding_cone_axis[i] = prim.bcone.axis[i];
- }
light_tree_emitters[emitter_index].theta_o = prim.bcone.theta_o;
light_tree_emitters[emitter_index].theta_e = prim.bcone.theta_e;
@@ -618,6 +613,9 @@ void LightManager::device_update_tree(Device *device,
int shader_flag = 0;
Object *object = scene->objects[prim.object_id];
Mesh *mesh = static_cast<Mesh *>(object->get_geometry());
+ Shader *shader = static_cast<Shader *>(
+ mesh->get_used_shaders()[mesh->get_shader()[prim.prim_id]]);
+
if (!(object->get_visibility() & PATH_RAY_CAMERA)) {
shader_flag |= SHADER_EXCLUDE_CAMERA;
}
@@ -639,12 +637,12 @@ void LightManager::device_update_tree(Device *device,
light_tree_emitters[emitter_index].prim_id = prim.prim_id + mesh->prim_offset;
light_tree_emitters[emitter_index].mesh_light.shader_flag = shader_flag;
+ light_tree_emitters[emitter_index].mesh_light.emission_sampling =
+ shader->emission_sampling;
triangle_array[prim.prim_id + object_lookup_offsets[prim.object_id]] = emitter_index;
}
else {
- Light *lamp = scene->lights[prim.object_id];
light_tree_emitters[emitter_index].prim_id = prim.prim_id;
- light_tree_emitters[emitter_index].lamp.size = lamp->size;
light_array[~prim.prim_id] = emitter_index;
}
diff --git a/intern/cycles/scene/shader.h b/intern/cycles/scene/shader.h
index e1fa4585bdf..8f59eefae05 100644
--- a/intern/cycles/scene/shader.h
+++ b/intern/cycles/scene/shader.h
@@ -34,15 +34,6 @@ struct float3;
enum ShadingSystem { SHADINGSYSTEM_OSL, SHADINGSYSTEM_SVM };
/* Keep those in sync with the python-defined enum. */
-enum EmissionSampling {
- EMISSION_SAMPLING_NONE = 0,
- EMISSION_SAMPLING_AUTO = 1,
- EMISSION_SAMPLING_FRONT = 2,
- EMISSION_SAMPLING_BACK = 3,
- EMISSION_SAMPLING_FRONT_BACK = 4,
-
- EMISSION_SAMPLING_NUM
-};
enum VolumeSampling {
VOLUME_SAMPLING_DISTANCE = 0,
More information about the Bf-blender-cvs
mailing list