Shader Nodes: add Alpha output to Object Info node

An alpha component can be specified for an object's color. This adds an alpha
socket to the object info shader node allowing for the alpha component of the
object's color to be accessed in the shader editor.

Differential Revision: https://developer.blender.org/D14141
This commit is contained in:
Ethan-Hall 2022-03-07 17:34:52 +01:00 committed by Brecht Van Lommel
parent 76f9d83a19
commit 5b4ab89663
13 changed files with 39 additions and 1 deletions

View File

@ -319,7 +319,9 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
(object->get_geometry() && object->get_geometry()->is_modified())) {
object->name = b_ob.name().c_str();
object->set_pass_id(b_ob.pass_index());
object->set_color(get_float3(b_ob.color()));
const BL::Array<float, 4> object_color = b_ob.color();
object->set_color(get_float3(object_color));
object->set_alpha(object_color[3]);
object->set_tfm(tfm);
/* dupli texture coordinates and random_id */

View File

@ -263,6 +263,16 @@ ccl_device_inline float3 object_color(KernelGlobals kg, int object)
return make_float3(kobject->color[0], kobject->color[1], kobject->color[2]);
}
/* Alpha of the object */
ccl_device_inline float object_alpha(KernelGlobals kg, int object)
{
if (object == OBJECT_NONE)
return 0.0f;
return kernel_tex_fetch(__objects, object).alpha;
}
/* Pass ID number of object */
ccl_device_inline float object_pass_id(KernelGlobals kg, int object)

View File

@ -76,6 +76,7 @@ ustring OSLRenderServices::u_raster("raster");
ustring OSLRenderServices::u_ndc("NDC");
ustring OSLRenderServices::u_object_location("object:location");
ustring OSLRenderServices::u_object_color("object:color");
ustring OSLRenderServices::u_object_alpha("object:alpha");
ustring OSLRenderServices::u_object_index("object:index");
ustring OSLRenderServices::u_geom_dupli_generated("geom:dupli_generated");
ustring OSLRenderServices::u_geom_dupli_uv("geom:dupli_uv");
@ -873,6 +874,10 @@ bool OSLRenderServices::get_object_standard_attribute(const KernelGlobalsCPU *kg
float3 f = object_color(kg, sd->object);
return set_attribute_float3(f, type, derivatives, val);
}
else if (name == u_object_alpha) {
float f = object_alpha(kg, sd->object);
return set_attribute_float(f, type, derivatives, val);
}
else if (name == u_object_index) {
float f = object_pass_id(kg, sd->object);
return set_attribute_float(f, type, derivatives, val);

View File

@ -259,6 +259,7 @@ class OSLRenderServices : public OSL::RendererServices {
static ustring u_ndc;
static ustring u_object_location;
static ustring u_object_color;
static ustring u_object_alpha;
static ustring u_object_index;
static ustring u_geom_dupli_generated;
static ustring u_geom_dupli_uv;

View File

@ -5,12 +5,14 @@
shader node_object_info(output point Location = point(0.0, 0.0, 0.0),
output color Color = color(1.0, 1.0, 1.0),
output float Alpha = 1.0,
output float ObjectIndex = 0.0,
output float MaterialIndex = 0.0,
output float Random = 0.0)
{
getattribute("object:location", Location);
getattribute("object:color", Color);
getattribute("object:alpha", Alpha);
getattribute("object:index", ObjectIndex);
getattribute("material:index", MaterialIndex);
getattribute("object:random", Random);

View File

@ -116,6 +116,9 @@ ccl_device_noinline void svm_node_object_info(KernelGlobals kg,
stack_store_float3(stack, out_offset, object_color(kg, sd->object));
return;
}
case NODE_INFO_OB_ALPHA:
data = object_alpha(kg, sd->object);
break;
case NODE_INFO_OB_INDEX:
data = object_pass_id(kg, sd->object);
break;

View File

@ -142,6 +142,7 @@ typedef enum NodeGeometry {
typedef enum NodeObjectInfo {
NODE_INFO_OB_LOCATION,
NODE_INFO_OB_COLOR,
NODE_INFO_OB_ALPHA,
NODE_INFO_OB_INDEX,
NODE_INFO_MAT_INDEX,
NODE_INFO_OB_RANDOM

View File

@ -1307,6 +1307,7 @@ typedef struct KernelObject {
float pass_id;
float random_number;
float color[3];
float alpha;
int particle_index;
float dupli_generated[3];
@ -1330,6 +1331,7 @@ typedef struct KernelObject {
uint visibility;
int primitive_type;
int pad[2];
} KernelObject;
static_assert_align(KernelObject, 16);

View File

@ -76,6 +76,7 @@ NODE_DEFINE(Object)
SOCKET_TRANSFORM(tfm, "Transform", transform_identity());
SOCKET_UINT(visibility, "Visibility", ~0);
SOCKET_COLOR(color, "Color", zero_float3());
SOCKET_FLOAT(alpha, "Alpha", 0.0f);
SOCKET_UINT(random_id, "Random ID", 0);
SOCKET_INT(pass_id, "Pass ID", 0);
SOCKET_BOOLEAN(use_holdout, "Use Holdout", false);
@ -414,6 +415,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
kobject.color[0] = color.x;
kobject.color[1] = color.y;
kobject.color[2] = color.z;
kobject.alpha = ob->alpha;
kobject.pass_id = pass_id;
kobject.random_number = random_number;
kobject.particle_index = particle_index;

View File

@ -44,6 +44,7 @@ class Object : public Node {
NODE_SOCKET_API(uint, random_id)
NODE_SOCKET_API(int, pass_id)
NODE_SOCKET_API(float3, color)
NODE_SOCKET_API(float, alpha)
NODE_SOCKET_API(ustring, asset_name)
vector<ParamValue> attributes;
NODE_SOCKET_API(uint, visibility)

View File

@ -4216,6 +4216,7 @@ NODE_DEFINE(ObjectInfoNode)
SOCKET_OUT_VECTOR(location, "Location");
SOCKET_OUT_COLOR(color, "Color");
SOCKET_OUT_FLOAT(alpha, "Alpha");
SOCKET_OUT_FLOAT(object_index, "Object Index");
SOCKET_OUT_FLOAT(material_index, "Material Index");
SOCKET_OUT_FLOAT(random, "Random");
@ -4239,6 +4240,11 @@ void ObjectInfoNode::compile(SVMCompiler &compiler)
compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_COLOR, compiler.stack_assign(out));
}
out = output("Alpha");
if (!out->links.empty()) {
compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_ALPHA, compiler.stack_assign(out));
}
out = output("Object Index");
if (!out->links.empty()) {
compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_INDEX, compiler.stack_assign(out));

View File

@ -4,12 +4,14 @@ void node_object_info(mat4 obmat,
float mat_index,
out vec3 location,
out vec4 color,
out float alpha,
out float object_index,
out float material_index,
out float random)
{
location = obmat[3].xyz;
color = obcolor;
alpha = obcolor.w;
object_index = info.x;
material_index = mat_index;
random = info.z;

View File

@ -9,6 +9,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.add_output<decl::Vector>(N_("Location"));
b.add_output<decl::Color>(N_("Color"));
b.add_output<decl::Float>(N_("Alpha"));
b.add_output<decl::Float>(N_("Object Index"));
b.add_output<decl::Float>(N_("Material Index"));
b.add_output<decl::Float>(N_("Random"));