 e760972221
			
		
	
	e760972221
	
	
	
		
			
			Custom render passes are added in the Shader AOVs panel in the view layer settings, with a name and data type. In shader nodes, an AOV Output node is then used to output either a value or color to the pass. Arbitrary names can be used for these passes, as long as they don't conflict with built-in passes that are enabled. The AOV Output node can be used in both material and world shader nodes. Implemented by Lukas, with tweaks by Brecht. Differential Revision: https://developer.blender.org/D4837
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright 2011-2017 Blender Foundation
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  * http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| CCL_NAMESPACE_BEGIN
 | |
| 
 | |
| /* This kernel evaluates ShaderData structure from the values computed
 | |
|  * by the previous kernels.
 | |
|  */
 | |
| ccl_device void kernel_shader_eval(KernelGlobals *kg)
 | |
| {
 | |
| 
 | |
|   int ray_index = ccl_global_id(1) * ccl_global_size(0) + ccl_global_id(0);
 | |
|   /* Sorting on cuda split is not implemented */
 | |
| #ifdef __KERNEL_CUDA__
 | |
|   int queue_index = kernel_split_params.queue_index[QUEUE_ACTIVE_AND_REGENERATED_RAYS];
 | |
| #else
 | |
|   int queue_index = kernel_split_params.queue_index[QUEUE_SHADER_SORTED_RAYS];
 | |
| #endif
 | |
|   if (ray_index >= queue_index) {
 | |
|     return;
 | |
|   }
 | |
|   ray_index = get_ray_index(kg,
 | |
|                             ray_index,
 | |
| #ifdef __KERNEL_CUDA__
 | |
|                             QUEUE_ACTIVE_AND_REGENERATED_RAYS,
 | |
| #else
 | |
|                             QUEUE_SHADER_SORTED_RAYS,
 | |
| #endif
 | |
|                             kernel_split_state.queue_data,
 | |
|                             kernel_split_params.queue_size,
 | |
|                             0);
 | |
| 
 | |
|   if (ray_index == QUEUE_EMPTY_SLOT) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ccl_global char *ray_state = kernel_split_state.ray_state;
 | |
|   if (IS_STATE(ray_state, ray_index, RAY_ACTIVE)) {
 | |
|     ccl_global PathState *state = &kernel_split_state.path_state[ray_index];
 | |
|     uint buffer_offset = kernel_split_state.buffer_offset[ray_index];
 | |
|     ccl_global float *buffer = kernel_split_params.tile.buffer + buffer_offset;
 | |
| 
 | |
|     shader_eval_surface(kg, kernel_split_sd(sd, ray_index), state, buffer, state->flag);
 | |
| #ifdef __BRANCHED_PATH__
 | |
|     if (kernel_data.integrator.branched) {
 | |
|       shader_merge_closures(kernel_split_sd(sd, ray_index));
 | |
|     }
 | |
|     else
 | |
| #endif
 | |
|     {
 | |
|       shader_prepare_closures(kernel_split_sd(sd, ray_index), state);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| CCL_NAMESPACE_END
 |