Radeon ProRender

Emissive Shape Creation

Emissive shapes are simply rpr_shapes created with rprContextCreateMesh() with an RPR_MATERIAL_NODE_EMISSIVE material.

We need to create both a shape and an emissive material. Note that the amount of light emitted (radiance) is per unit area, so a larger light will emit more light. Often this behavior is undesired, in which case the ‘color’ parameter to RPR_MATERIAL_NODE_EMISSIVE should be scaled down with the surface area of the geometry.

// Create a light
rpr_shape light;
{
	CHECK( rprContextCreateMesh(context,
		(rpr_float const*)&plane_data[0], 4, sizeof(vertex),
		(rpr_float const*)((char*)&plane_data[0] + sizeof(rpr_float)*3), 4, sizeof(vertex),
		(rpr_float const*)((char*)&plane_data[0] + sizeof(rpr_float)*6), 4, sizeof(vertex),
		(rpr_int const*)indices, sizeof(rpr_int),
		(rpr_int const*)indices, sizeof(rpr_int),
		(rpr_int const*)indices, sizeof(rpr_int),
		num_face_vertices, 2, &light) );

	// Create a transform    
	RadeonProRender::matrix lightm = RadeonProRender::translation(RadeonProRender::float3(0,8,2));

	// Set the transform for the light
	CHECK( rprShapeSetTransform(light, RPR_TRUE, &lightm.m00) );

	// Create an emissive material
	rpr_material_node emissive;
	{
		CHECK( rprMaterialSystemCreateNode(matsys, RPR_MATERIAL_NODE_EMISSIVE, &emissive) );

		// Set diffuse color parameter to red
		CHECK( rprMaterialNodeSetInputF(emissive, "color", 3.5f, 0.0f, 0.0f, 0.f) );

		// Apply the material on the shape               
		CHECK( rprShapeSetMaterial(light, emissive) );
	}

	// Attach the light to the scene
	CHECK( rprSceneAttachShape(scene, light) );
}

An example of creating an emissive shape can be found in the Basic Scene demo.