- Radeon ProRender SDK
- Downloading and Getting Started
- How to Use RPR SDK
- Data Types
- Data Structs
- Info and Setting Types
- rpr_aa_filter
- rpr_aov
- rpr_api_version
- rpr_bool
- rpr_buffer_element_type
- rpr_buffer_info
- rpr_camera_info
- rpr_camera_mode
- rpr_color_space
- rpr_component_type
- rpr_composite_info
- rpr_composite_type
- rpr_context_info
- rpr_context_sampler_type
- rpr_context_properties
- rpr_creation_flags
- rpr_curve_parameter
- rpr_environment_override
- rpr_framebuffer_info
- rpr_grid_indices_topology
- rpr_grid_parameter
- rpr_hetero_volume_filter
- rpr_hetero_volume_indices_topology
- rpr_hetero_volume_parameter
- rpr_image_filter_type
- rpr_image_info
- rpr_image_wrap_type
- rpr_instance_info
- rpr_light_info
- rpr_light_type
- rpr_lut_info
- rpr_material_node_arithmetic_operation
- rpr_material_node_info
- rpr_material_node_input
- rpr_material_node_input_info
- rpr_material_node_input_type
- rpr_material_node_lookup_value
- rpr_material_node_transform_op
- rpr_material_node_type
- rpr_material_node_uvtype_value
- rpr_material_system_info
- rpr_mesh_info
- rpr_object_info
- rpr_parameter_info
- rpr_parameter_type
- rpr_post_effect_info
- rpr_post_effect_type
- rpr_render_mode
- rpr_scene_info
- rpr_shape_info
- rpr_shape_type
- rpr_status
- rpr_subdiv_boundary_interfop_type
- rpr_tonemapping_operator
- rpr_ubermaterial_emission_mode
- rpr_ubermaterial_ior_mode
- rpr_volume_type
- Shaders
- rpr_material_node_add
- rpr_material_node_ao_map
- rpr_material_node_arithmetic
- rpr_material_node_blend
- rpr_material_node_blend_value
- rpr_material_node_buffer_sampler
- rpr_material_node_bump_map
- rpr_material_node_checker_texture
- rpr_material_node_constant_texture
- rpr_material_node_diffuse
- rpr_material_node_diffuse_refraction
- rpr_material_node_dot_texture
- rpr_material_node_emissive
- rpr_material_node_fresnel
- rpr_material_node_fresnel_schlick
- rpr_material_node_gradient_texture
- rpr_material_node_image_texture
- rpr_material_node_input_lookup
- rpr_material_node_microfacet
- rpr_material_node_microfacet_anisotropic_reflection
- rpr_material_node_microfacet_anisotropic_refraction
- rpr_material_node_microfacet_beckmann
- rpr_material_node_microfacet_refraction
- rpr_material_node_noise2d_texture
- rpr_material_node_normal_map
- rpr_material_node_orennayar
- rpr_material_node_passthrough
- rpr_material_node_phong
- rpr_material_node_reflection
- rpr_material_node_refraction
- rpr_material_node_transparent
- rpr_material_node_twosided
- rpr_material_node_uv_procedural
- rpr_material_node_uv_triplanar
- rpr_material_node_volume
- rpr_material_node_ward
- Tutorials
- Basic Scene Demo
- Context Creation
- Scene Creation
- Camera Setup
- Mesh Creation
- Instance Creation
- Deformation Motion Blur
- Point Light Creation
- Emissive Shape Creation
- Environment Light Creation
- Textured Material Creation
- Materials Demo
- Uber Material Creation
- SSS Uber Material Creation
- Two Sided Materials
- Tiled Rendering
- AOVs Setting
- Framebuffer Access
- OpenGL Interop
- Gamma Post Process Effect
- Curve Creation
- Import/Export
- Shadow Catcher
- Adaptive Sampling
- Tracing
- Parameters Enumeration
- Volume
- Hybrid
- Mesh Obj
- API Reference
- rprBufferGetInfo
- rprCameraGetInfo
- rprCameraLookAt
- rprCameraSetAngularMotion
- rprCameraSetApertureBlades
- rprCameraSetExposure
- rprCameraSetFarPlane
- rprCameraSetFocalLength
- rprCameraSetFocalTilt
- rprCameraSetFocusDistance
- rprCameraSetFStop
- rprCameraSetIPD
- rprCameraSetLensShift
- rprCameraSetLinearMotion
- rprCameraSetMode
- rprCameraSetNearPlane
- rprCameraSetOrthoHeight
- rprCameraSetOrthoWidth
- rprCameraSetSensorSize
- rprCameraSetTiltCorrection
- rprCameraSetTransform
- rprCompositeCompute
- rprCompositeGetInfo
- rprCompositeSetInput1u
- rprCompositeSetInput4f
- rprCompositeSetInputC
- rprCompositeSetInputFb
- rprCompositeSetInputLUT
- rprCompositeSetInputOp
- rprContextAbortRender
- rprContextAttachPostEffect
- rprContextAttachRenderLayer
- rprContextClearMemory
- rprContextCreateBuffer
- rprContextCreateCamera
- rprContextCreateComposite
- rprContextCreateCurve
- rprContextCreateDirectionalLight
- rprContextCreateDiskLight
- rprContextCreateEnvironmentLight
- rprContextCreateFrameBuffer
- rprContextCreateFramebufferFromGLTexture2D
- rprContextCreateGrid
- rprContextCreateHeteroVolume
- rprContextCreateIESLight
- rprContextCreateImage
- rprContextCreateImageFromFile
- rprContextCreateImageFromFileMemory
- rprContextCreateInstance
- rprContextCreateLUTFromData
- rprContextCreateLUTFromFile
- rprContextCreateMaterialSystem
- rprContextCreateMesh
- rprContextCreateMeshEx
- rprContextCreateMeshEx2
- rprContextCreatePointLight
- rprContextCreatePostEffect
- rprContextCreateScene
- rprContextCreateSkyLight
- rprContextCreateSphereLight
- rprContextCreateSpotLight
- rprContextDetachPostEffect
- rprContextDetachRenderLayer
- rprContextGetAOV
- rprContextGetAttachedPostEffect
- rprContextGetAttachedPostEffectCount
- rprContextGetInfo
- rprContextGetParameterInfo
- rprContextGetScene
- rprContextRender
- rprContextRenderTile
- rprContextResolveFrameBuffer
- rprContextSetActivePlugin
- rprContextSetAOV
- rprContextSetAOVindexLookup
- rprContextSetAOVindicesLookup
- rprContextSetParameterByKey1f
- rprContextSetParameterByKey1u
- rprContextSetParameterByKey3f
- rprContextSetParameterByKey4f
- rprContextSetParameterByKeyPtr
- rprContextSetParameterByKeyString
- rprContextSetParameterString
- rprContextSetScene
- rprCreateContext
- rprCurveGetInfo
- rprCurveSetMaterial
- rprCurveSetTransform
- rprCurveSetVisibility
- rprCurveSetVisibilityFlag
- rprDirectionalLightSetRadiantPower3f
- rprDirectionalLightSetShadowSoftnessAngle
- rprDiskLightSetAngle
- rprDiskLightSetRadiantPower3f
- rprDiskLightSetRadius
- rprEnvironmentLightAttachPortal
- rprEnvironmentLightDetachPortal
- rprEnvironmentLightGetEnvironmentLightOverride
- rprEnvironmentLightSetEnvironmentLightOverride
- rprEnvironmentLightSetImage
- rprEnvironmentLightSetIntensityScale
- rprFrameBufferClear
- rprFrameBufferFillWithColor
- rprFrameBufferGetInfo
- rprFrameBufferSaveToFile
- rprFrameBufferSaveToFileEx
- rprFrameBufferSetLPE
- rprGridGetInfo
- rprHeteroVolumeGetInfo
- rprHeteroVolumeSetAlbedo
- rprHeteroVolumeSetAlbedoGrid
- rprHeteroVolumeSetAlbedoLookup
- rprHeteroVolumeSetAlbedoScale
- rprHeteroVolumeSetDensityGrid
- rprHeteroVolumeSetDensityLookup
- rprHeteroVolumeSetDensityScale
- rprHeteroVolumeSetEmission
- rprHeteroVolumeSetEmissionGrid
- rprHeteroVolumeSetEmissionLookup
- rprHeteroVolumeSetEmissionScale
- rprHeteroVolumeSetFilter
- rprHeteroVolumeSetTransform
- rprIESLightSetImageFromFile
- rprIESLightSetImageFromIESdata
- rprIESLightSetRadiantPower3f
- rprImageGetInfo
- rprImageSetFilter
- rprImageSetGamma
- rprImageSetInternalCompression
- rprImageSetMipmapEnabled
- rprImageSetOcioColorspace
- rprImageSetUDIM
- rprImageSetWrap
- rprInstanceGetBaseShape
- rprLightGetInfo
- rprLightSetGroupId
- rprLightSetTransform
- rprMaterialNodeGetInfo
- rprMaterialNodeGetInputInfo
- rprMaterialNodeSetID
- rprMaterialNodeSetInputBufferDataByKey
- rprMaterialNodeSetInputFByKey
- rprMaterialNodeSetInputImageDataByKey
- rprMaterialNodeSetInputNByKey
- rprMaterialNodeSetInputUByKey
- rprMaterialSystemCreateNode
- rprMaterialSystemGetInfo
- rprMaterialSystemGetSize
- rprMeshGetInfo
- rprObjectDelete
- rprObjectSetName
- rprPointLightSetRadiantPower3f
- rprPostEffectGetInfo
- rprPostEffectSetParameter1f
- rprPostEffectSetParameter1u
- rprPostEffectSetParameter3f
- rprPostEffectSetParameter4f
- rprRegisterPlugin
- rprSceneAttachCurve
- rprSceneAttachHeteroVolume
- rprSceneAttachLight
- rprSceneAttachShape
- rprSceneClear
- rprSceneDetachCurve
- rprSceneDetachHeteroVolume
- rprSceneDetachLight
- rprSceneDetachShape
- rprSceneGetBackgroundImage
- rprSceneGetCamera
- rprSceneGetCameraRight
- rprSceneGetEnvironmentLight
- rprSceneGetInfo
- rprSceneSetBackgroundImage
- rprSceneSetCamera
- rprSceneSetCameraRight
- rprSceneSetEnvironmentLight
- rprShapeAttachRenderLayer
- rprShapeAutoAdaptSubdivisionFactor
- rprShapeDetachRenderLayer
- rprShapeGetInfo
- rprShapeMarkStatic
- rprShapeSetAngularMotion
- rprShapeSetContourIgnore
- rprShapeSetDisplacementMaterial
- rprShapeSetDisplacementScale
- rprShapeSetHeteroVolume
- rprShapeSetLayerMask
- rprShapeSetLightGroupID
- rprShapeSetLinearMotion
- rprShapeSetMaterial
- rprShapeSetMaterialFaces
- rprShapeSetMotionTransform
- rprShapeSetMotionTransformCount
- rprShapeSetObjectGroupID
- rprShapeSetObjectID
- rprShapeSetScaleMotion
- rprShapeSetReflectionCatcher
- rprShapeSetShadowCatcher
- rprShapeSetSubdivisionAutoRatioCap
- rprShapeSetSubdivisionBoundaryInterop
- rprShapeSetSubdivisionCreaseWeight
- rprShapeSetSubdivisionFactor
- rprShapeSetTransform
- rprShapeSetVertexValue
- rprShapeSetVisibility
- rprShapeSetVisibilityFlag
- rprShapeSetVisibilityInSpecular
- rprShapeSetVolumeMaterial
- rprSkyLightAttachPortal
- rprSkyLightDetachPortal
- rprSkyLightSetAlbedo
- rprSkyLightSetDirection
- rprSkyLightSetScale
- rprSkyLightSetTurbidity
- rprSphereLightSetRadiantPower3f
- rprSphereLightSetRadius
- rprSpotLightSetConeShape
- rprSpotLightSetImage
- rprSpotLightSetRadiantPower3f
- Transitioning from RPR 1.X to 2.0
- Radeon Image Filters
- Basic Example
- Filters
- ACES filmic tone mapping filter
- AI custom model filter
- AI denoiser filter
- AI upscale filter
- Auto linear tone mapping filter
- BGRA TO RGBA conversion filter
- Bilateral denoiser filter
- Binary operation filter
- Bloom filter
- Color space changing filter
- Convert filter
- Depth of field filter
- Dilate (erode) filter
- Drago tone mapping filter
- Dynamic resampling filter
- Edge-avoiding À-Trous wavelet filter
- Emboss filter
- Exponential tone mapping filter
- Filmic uncharted tone mapping filter
- Gamma correction filter
- Gaussian blurring filter
- Horizontal flip filter
- Hue-saturation changing filter
- Laplace edge detection filter
- Linear photographic tone mapping filter
- Linear tone mapping filter
- Local weighted regression filter
- Max-white tone mapping filter
- Median denoiser filter
- Morphological antialiasing filter
- Motion blur filter
- Motion buffer filter
- Multiplication filter
- NDC depth filter
- Photographic tone mapping filter
- Posterization filter
- Range remap filter
- Reinhard tone mapping filter
- Resampling filter
- RGB noise filter
- Rotation filter
- Sharpen filter
- Sobel edge detection filter
- Spread filter
- Temporal accumulation filter
- User defined filter
- Vertical flip filter
- Weighted sum filter
- Combining Filters
- Data Types
- Data Structs
- Info and Setting Types
- API Reference
- rifCommandQueueAttachImageFilter
- rifCommandQueueAttachImageFilterRect
- rifCommandQueueDetachImageFilter
- rifContextCreateCommandQueue
- rifContextCreateImage
- rifContextCreateImageFilter
- rifContextCreateImageFromDirectX11Buffer
- rifContextCreateImageFromDirectX11Texture
- rifContextCreateImageFromDirectX12Memory
- rifContextCreateImageFromMetalMemory
- rifContextCreateImageFromOpenClMemory
- rifContextCreateImageFromOpenGlTexture
- rifContextExecuteCommandQueue
- rifContextGetDeviceInfo
- rifContextGetInfo
- rifContextSetInfo
- rifCreateContext
- rifCreateContextFromDirectX12Context
- rifCreateContextFromMetalContext
- rifCreateContextFromOpenClContext
- rifCreateOpenCLContextSharedWithDirectX11
- rifFlushQueue
- rifGetDeviceCount
- rifGetErrorCodeDescription
- rifGetErrorCodeString
- rifGetLastErrorMessage
- rifImageFilterClearParameterImage
- rifImageFilterGetInfo
- rifImageFilterSetComputeType
- rifImageFilterSetParameter1f
- rifImageFilterSetParameter1i
- rifImageFilterSetParameter1u
- rifImageFilterSetParameter2f
- rifImageFilterSetParameter2i
- rifImageFilterSetParameter2u
- rifImageFilterSetParameter3f
- rifImageFilterSetParameter3i
- rifImageFilterSetParameter3u
- rifImageFilterSetParameter4f
- rifImageFilterSetParameter4i
- rifImageFilterSetParameter4u
- rifImageFilterSetParameter8f
- rifImageFilterSetParameter8i
- rifImageFilterSetParameter8u
- rifImageFilterSetParameter16f
- rifImageFilterSetParameter16i
- rifImageFilterSetParameter16u
- rifImageFilterSetParameterFloatArray
- rifImageFilterSetParameterImage
- rifImageFilterSetParameterImageArray
- rifImageFilterSetParameterString
- rifImageGetInfo
- rifImageMap
- rifImageUnmap
- rifObjectDelete
- rifParameterGetInfo
- rifSyncronizeQueue
- Tracing
- Radeon Machine Learning
- Examples
- Data Types
- Data Structs
- rml_context
- rml_context_params
- rml_graph
- rml_memory_info
- rml_model
- rml_op
- rml_op_batch_norm_params
- rml_op_bias_add_params
- rml_op_binary_params
- rml_op_cast_params
- rml_op_celu_params
- rml_op_clip_params
- rml_op_concat_params
- rml_op_const_params
- rml_op_conv_2d_params
- rml_op_conv_2d_transpose_params
- rml_op_desc
- rml_op_depth_to_space_params
- rml_op_elu_params
- rml_op_flatten_params
- rml_op_gemm_params
- rml_op_leaky_relu_params
- rml_op_local_response_norm_params
- rml_op_pad_params
- rml_op_placeholder_params
- rml_op_pool_2d_params
- rml_op_pool_2d_global_params
- rml_op_port_params
- rml_op_pow_params
- rml_op_quantize_linear_params
- rml_op_reduce_params
- rml_op_resize_2d_params
- rml_op_reshape_params
- rml_op_round_params
- rml_op_selu_params
- rml_op_slice_params
- rml_op_space_to_depth_params
- rml_op_squeeze_params
- rml_op_stack_params
- rml_op_thresholded_relu_params
- rml_op_top_k_params
- rml_op_transpose_params
- rml_op_unary_params
- rml_op_unsqueeze_params
- rml_size_2d
- rml_strings
- rml_tensor
- rml_tensor_info
- Info and Setting Types
- API Reference
- rmlConnectGraphs
- rmlCreateContextFromClQueue
- rmlCreateContextFromD3DQueue
- rmlCreateContextFromMTLQueue
- rmlCreateDefaultContext
- rmlCreateGraph
- rmlCreateModelFromGraph
- rmlCreateOperation
- rmlCreateTensor
- rmlCreateTensorFromClBuffer
- rmlCreateTensorFromD3DResource
- rmlCreateTensorFromMTLBuffer
- rmlGetClBufferFromTensor
- rmlGetD3DResourceFromTensor
- rmlGetGraphInputNames
- rmlGetGraphOutputNames
- rmlGetLastError
- rmlGetMTLBufferFromTensor
- rmlGetModelInputInfo
- rmlGetModelMemoryInfo
- rmlGetModelOutputInfo
- rmlGetTensorInfo
- rmlInfer
- rmlLoadGraph
- rmlLoadGraphFromBuffer
- rmlLoadGraphFromFile
- rmlMapTensor
- rmlPrepareModel
- rmlReleaseContext
- rmlReleaseGraph
- rmlReleaseModel
- rmlReleaseTensor
- rmlResetModelStates
- rmlSetD3DCommandList
- rmlSetDMLFloat16Allowed
- rmlSetLoggingEnabled
- rmlSetMIOpenAutoTuningOn
- rmlSetModelInput
- rmlSetModelInputInfo
- rmlSetModelOutput
- rmlSetModelOutputNames
- rmlSetNumD3DCommandLists
- rmlUnmapTensor
- RadeonRays
- Examples
- Data Types
- Data Structs
- Info and Setting Types
- API Reference
- rrAllocateAccelerationStructureDevicePtr
- rrAllocateCommandStream
- rrAllocateDeviceBuffer
- rrCmdBuildGeometry
- rrCmdBuildScene
- rrCmdIntersect
- rrCreateContext
- rrCreateContextDX
- rrCreateContextMTL
- rrCreateContextVk
- rrCreateGroupMPS
- rrDestroyContext
- rrGetCommandStreamFromD3D12CommandList
- rrGetCommandStreamFromMTLCommandBuffer
- rrGetCommandStreamFromVkCommandBuffer
- rrGetDevicePtrFromBuffer
- rrGetDevicePtrFromD3D12Resource
- rrGetDevicePtrFromMTLResource
- rrGetDevicePtrFromVkBuffer
- rrGetGeometryBuildMemoryRequirements
- rrGetSceneBuildMemoryRequirements
- rrGetTraceMemoryRequirements
- rrMapDevicePtr
- rrReleaseCommandStream
- rrReleaseDevicePtr
- rrReleaseEvent
- rrReleaseExternalCommandStream
- rrSetLogFile
- rrSetLogLevel
- rrSubmitCommandStream
- rrUnmapDevicePtr
- rrWaitEvent
- Uber Shader
- Radeon ProRender Plug-ins
- Material Library
- Blender
- Maya
- 3ds Max
- Unreal Engine
- Houdini
- Inventor
- USD Hydra Delegate
Basic Example for Metal¶
The following walkthrough is a basic example for the Metal backend.
CHECK_RR_CALL
is a macro asserting RadeonRays calls finished with RR_SUCCESS
.
void Build2LvlScene()
{
auto device = ChooseDevice();
auto cmd_queue = [device newCommandQueue];
Create a library context.
RRContext context = nullptr; CHECK_RR_CALL(rrCreateContextMTL(RR_API_VERSION, device, cmd_queue, &context));
Load shapes from a file.
MeshData mesh_data("example.obj");
Load indices and vertices to MTL buffers.
size_t vertex_size = sizeof(float) * mesh_data.positions.size(); size_t indices_size = sizeof(uint32_t) * mesh_data.indices.size(); id<MTLBuffer> indices_buf = [device newBufferWithLength:indices_size options:MTLResourceStorageModeManaged]; memcpy(indices_buf.contents, mesh_data.indices.data(), indices_buf.length); id<MTLBuffer> vertices_buf = [device newBufferWithLength:vertex_size options:MTLResourceStorageModeManaged]; memcpy(vertices_buf.contents, mesh_data.positions.data(), vertices_buf.length);
Update buffers and get a RadeonRays device pointer wrapper to use it in the library.
[indices_buf didModifyRange:NSMakeRange(0, indices_buf.length)]; [vertices_buf didModifyRange:NSMakeRange(0, vertices_buf.length)]; RRDevicePtr vertex_ptr = nullptr; RRDevicePtr index_ptr = nullptr; CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, vertices_buf, 0, &vertex_ptr)); CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, indices_buf, 0, &index_ptr));
Set geometry build info.
RRGeometryBuildInput geometry_build_input = {}; RRTriangleMeshPrimitive mesh = {}; geometry_build_input.triangle_mesh_primitives = &mesh; geometry_build_input.primitive_type = RR_PRIMITIVE_TYPE_TRIANGLE_MESH; geometry_build_input.triangle_mesh_primitives->vertices = vertex_ptr; geometry_build_input.triangle_mesh_primitives->vertex_count = mesh_data.positions.size() / 3; geometry_build_input.triangle_mesh_primitives->vertex_stride = 3 * sizeof(float); geometry_build_input.triangle_mesh_primitives->triangle_indices = index_ptr; geometry_build_input.triangle_mesh_primitives->triangle_count = mesh_data.indices.size() / 3; geometry_build_input.triangle_mesh_primitives->index_type = RR_INDEX_TYPE_UINT32; geometry_build_input.primitive_count = 1;
Create Metal performance shaders specific for a group acceleration structure to combine geometries and scenes.
RRDevicePtr group_ptr = nullptr; CHECK_RR_CALL(rrCreateGroupMPS(context, &group_ptr));
Group goes to backend-specific info.
RRBuildOptions options; options.build_flags = RR_BUILD_FLAG_BITS_ALLOW_UPDATE; options.backend_specific_info = group_ptr; RRDevicePtr geometry_ptr = nullptr; CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, nullptr, 0, &geometry_ptr));
Create a command stream to build an acceleration structure.
RRCommandStream build_geom_command_stream = nullptr; CHECK_RR_CALL(rrAllocateCommandStream(context, &build_geom_command_stream));
Register a build command.
CHECK_RR_CALL(rrCmdBuildGeometry( context, RR_BUILD_OPERATION_BUILD, &geometry_build_input, &options, nullptr, geometry_ptr, build_geom_command_stream)); RREvent wait_event = nullptr; CHECK_RR_CALL(rrSumbitCommandStream(context, build_geom_command_stream, nullptr, &wait_event));
Wait until completed.
CHECK_RR_CALL(rrWaitEvent(context, wait_event)); CHECK_RR_CALL(rrReleaseEvent(context, wait_event)); CHECK_RR_CALL(rrReleaseCommandStream(context, build_geom_command_stream));
Allocate another command stream to build a 2 level acceleration structure.
RRCommandStream build_scene_command_stream = nullptr; CHECK_RR_CALL(rrAllocateCommandStream(context, &build_scene_command_stream)); RREvent wait_scene_event = nullptr; RRDevicePtr scene_ptr = nullptr; CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, nullptr, 0, &scene_ptr));
It is a simple example so we are using just one instance and unit transform.
RRInstance instance = {geometry_ptr, {1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f}}; RRSceneBuildInput scene_build_input = {&instance, 1};
Register a build command in the command stream.
CHECK_RR_CALL(rrCmdBuildScene( context, &scene_build_input, &options, nullptr, scene_ptr, build_scene_command_stream)); CHECK_RR_CALL(rrSumbitCommandStream(context, build_scene_command_stream, nullptr, &wait_scene_event));
Wait until completed.
CHECK_RR_CALL(rrWaitEvent(context, wait_scene_event)); CHECK_RR_CALL(rrReleaseEvent(context, wait_scene_event)); CHECK_RR_CALL(rrReleaseCommandStream(context, build_scene_command_stream));
Now we can trace.
using Ray = MPSRayOriginMinDistanceDirectionMaxDistance; using Hit = MPSIntersectionDistancePrimitiveIndexInstanceIndexCoordinates; RRCommandStream trace_command_stream = nullptr; CHECK_RR_CALL(rrAllocateCommandStream(context, &trace_command_stream)); constexpr uint32_t kResolution = 640;
Generate rays.
std::vector<Ray> rays(kResolution * kResolution); std::vector<Hit> hits(kResolution * kResolution); for (int x = 0; x < kResolution; ++x) { for (int y = 0; y < kResolution; ++y) { auto i = kResolution * y + x; rays[i].origin[0] = 0.f; rays[i].origin[1] = 15.f; rays[i].origin[2] = 0.f; rays[i].direction[0] = -1.f; rays[i].direction[1] = -1.f + (2.f / kResolution) * y; rays[i].direction[2] = -1.f + (2.f / kResolution) * x; rays[i].minDistance = 0.001f; rays[i].maxDistance = 100000.f; hits[i].distance = 1.0f; } } size_t rays_size = sizeof(Ray) * rays.size(); size_t hits_size = sizeof(Hit) * hits.size();
Create MTL buffers for trace.
id<MTLBuffer> rays_buf = [device newBufferWithLength:rays_size options:MTLResourceStorageModeManaged]; memcpy(rays_buf.contents, rays.data(), rays_buf.length); [rays_buf didModifyRange:NSMakeRange(0, rays_buf.length)]; id<MTLBuffer> hits_buf = [device newBufferWithLength:hits_size options:MTLResourceStorageModeShared]; RRDevicePtr rays_ptr = nullptr; RRDevicePtr hits_ptr = nullptr; CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, rays_buf, 0, &rays_ptr)); CHECK_RR_CALL(rrGetDevicePtrFromMTLResource(context, hits_buf, 0, &hits_ptr));
Encode trace command.
CHECK_RR_CALL(rrCmdIntersect(context, scene_ptr, RR_INTERSECT_QUERY_CLOSEST, rays_ptr, kResolution * kResolution, nullptr, RR_INTERSECT_QUERY_OUTPUT_FULL_HIT, hits_ptr, trace_command_stream)); RREvent trace_wait_event = nullptr; CHECK_RR_CALL(rrSumbitCommandStream(context, trace_command_stream, nullptr, &trace_wait_event)); CHECK_RR_CALL(rrWaitEvent(context, trace_wait_event)); CHECK_RR_CALL(rrReleaseEvent(context, trace_wait_event)); CHECK_RR_CALL(rrReleaseCommandStream(context, trace_command_stream));
Update buffer.
memcpy(hits.data(), hits_buf.contents, hits_buf.length); std::vector<uint32_t> data(kResolution * kResolution);
Prepare output.
for (int y = 0; y < kResolution; ++y) { for (int x = 0; x < kResolution; ++x) { int wi = kResolution * (kResolution - 1 - y) + x; int i = kResolution * y + x; if (hits[i].distance >= 0.f) { data[wi] = 0xff000000 | (uint32_t(hits[i].coordinates[0] * 255) << 8) | (uint32_t(hits[i].coordinates[1] * 255) << 16); } else { data[wi] = 0xff101010; } } } stbi_write_jpg("example_mtl_scene.jpg", kResolution, kResolution, 4, data.data(), 120);
Release resources.
CHECK_RR_CALL(rrDestroyContext(context)); }