Files
test/source/blender/makesdna/DNA_object_defaults.h
Clément Foucault 81c00bf272 EEVEE: Shadow Terminator Normal Bias
This implement the design detailed in #135935.

A new per object property called `Shadow Terminator Normal Offset` is
introduced to shift the shadowed position along the shading normal.

The amount of shift is defined in object space on the object datablock.

This amount is modulated by the facing ratio to the light. Faces
already facing the light will get no offset. This avoids most light
leaking artifacts.

In case of multiple shading normal, the normal used for the shift
is arbitrary. Note that this is the same behavior for other biases.

The magnitude of the bias is controlled by `Shadow Terminator Normal Offset`.
The amount of faces affected by the bias is controlled using
`Shadow Terminator Geometry Offset` just like cycles.

Tweaking the `Shadow Terminator Geometry Offset` allows to avoid too much
shadow distortion on surfaces with bump mapping.

Cycles properties are copied from the Cycles object datablock to the
blender datablock. This break the python API for Cycles.

The defaults are set to no bias because:
- There is no good default. The best value depends on the geometry.
- The best value might depend on real-time displacement.
- Any bias will introduce light leaking on surfaces that do not need it.
- There is an additional cost of enabling it, which is proportional
  to the amount of pixels on screen using it.

Pull Request: https://projects.blender.org/blender/blender/pulls/136935
2025-04-25 19:12:04 +02:00

64 lines
1.6 KiB
C

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup DNA
*/
#pragma once
#include "DNA_vec_defaults.h"
/* clang-format off */
/* -------------------------------------------------------------------- */
/** \name Object Struct
* \{ */
#define _DNA_DEFAULT_Object \
{ \
/* Type is not very meaningful as a default, normally changed. */ \
.type = OB_EMPTY, \
.color = {1, 1, 1, 1}, \
\
.constinv = _DNA_DEFAULT_UNIT_M4, \
.parentinv = _DNA_DEFAULT_UNIT_M4, \
\
.scale = {1, 1, 1}, \
.dscale = {1, 1, 1}, \
/* Objects should default to having Euler XYZ rotations, \
* but rotations default to quaternions. */ \
.rotmode = ROT_MODE_EUL, \
/** See #unit_axis_angle. */ \
.rotAxis = {0, 1, 0}, \
.rotAngle = 0, \
.drotAxis = {0, 1, 0}, \
.drotAngle = 0, \
.quat = _DNA_DEFAULT_UNIT_QT, \
.dquat = _DNA_DEFAULT_UNIT_QT, \
.flag = OB_FLAG_USE_SIMULATION_CACHE, \
.protectflag = OB_LOCK_ROT4D, \
\
.dt = OB_TEXTURE, \
\
.empty_drawtype = OB_PLAINAXES, \
.empty_drawsize = 1.0, \
.empty_image_depth = OB_EMPTY_IMAGE_DEPTH_DEFAULT, \
.ima_ofs = {-0.5, -0.5}, \
\
.shadow_terminator_geometry_offset = 0.1f, \
\
.instance_faces_scale = 1, \
.col_group = 0x01, \
.col_mask = 0xffff, \
.preview = NULL, \
.duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT | OB_DUPLI_FLAG_RENDER, \
.pc_ids = {NULL, NULL}, \
.lineart = { .crease_threshold = DEG2RAD(140.0f) }, \
}
/** \} */
/* clang-format on */