void ShadingEngine::shade_environment( SamplingContext& sampling_context, const ShadingContext& shading_context, const ShadingPoint& shading_point, ShadingResult& shading_result) const { // Retrieve the environment shader of the scene. const EnvironmentShader* environment_shader = shading_point.get_scene().get_environment()->get_environment_shader(); if (environment_shader) { // There is an environment shader: execute it. InputEvaluator input_evaluator(shading_context.get_texture_cache()); const ShadingRay& ray = shading_point.get_ray(); const Vector3d direction = normalize(ray.m_dir); environment_shader->evaluate( input_evaluator, direction, shading_result); // Set environment shader AOV. shading_result.set_entity_aov(*environment_shader); } else { // No environment shader: shade as transparent black. shading_result.set_main_to_transparent_black_linear_rgba(); shading_result.set_aovs_to_transparent_black_linear_rgba(); } }
void ShadingEngine::shade_hit_point( SamplingContext& sampling_context, const PixelContext& pixel_context, const ShadingContext& shading_context, const ShadingPoint& shading_point, ShadingResult& shading_result) const { // Retrieve the material of the intersected surface. const Material* material = shading_point.get_material(); // Compute the alpha channel of the main output. if (material && material->get_alpha_map()) { // There is an alpha map: evaluate it. material->get_alpha_map()->evaluate( shading_context.get_texture_cache(), shading_point.get_uv(0), shading_result.m_main.m_alpha); } else { // No alpha map: solid sample. shading_result.m_main.m_alpha = Alpha(1.0f); } #ifdef WITH_OSL if (material && material->get_osl_surface() && material->get_osl_surface()->has_transparency()) { Alpha a; shading_context.execute_osl_transparency( *material->get_osl_surface(), shading_point, a); shading_result.m_main.m_alpha *= a; } #endif if (shading_result.m_main.m_alpha[0] > 0.0f || material->shade_alpha_cutouts()) { // Use the diagnostic surface shader if there is one. const SurfaceShader* surface_shader = m_diagnostic_surface_shader.get(); if (surface_shader == 0) { if (material == 0) { // The intersected surface has no material: return solid pink. shading_result.set_main_to_opaque_pink_linear_rgba(); shading_result.set_aovs_to_transparent_black_linear_rgba(); return; } // Use the surface shader of the intersected surface. surface_shader = material->get_surface_shader(); if (surface_shader == 0) { // The intersected surface has no surface shader: return solid pink. shading_result.set_main_to_opaque_pink_linear_rgba(); shading_result.set_aovs_to_transparent_black_linear_rgba(); return; } } // Execute the surface shader. surface_shader->evaluate( sampling_context, pixel_context, shading_context, shading_point, shading_result); // Set AOVs. shading_result.set_entity_aov(shading_point.get_assembly()); shading_result.set_entity_aov(shading_point.get_assembly_instance()); shading_result.set_entity_aov(shading_point.get_object()); shading_result.set_entity_aov(shading_point.get_object_instance()); if (material) shading_result.set_entity_aov(*material); shading_result.set_entity_aov(*surface_shader); } else { // Alpha is zero: shade as transparent black. shading_result.set_main_to_transparent_black_linear_rgba(); shading_result.set_aovs_to_transparent_black_linear_rgba(); } }