I have watched the Enhance Your App with Metal Ray Tracing video ( wwdc21-10149 ) a few times and am very interested in many of the upcoming features described. It seems as though there will be some tweaks ( ie. Instance IDs ) and some major additions ( ie. Keyframe Animation ).
I am wondering if there is any sense of the timing of these features becoming available ( beta or otherwise ) and also, if some of the sample code might be provided in Swift.
Thanks so much for the work that went into the video and explanations.
Post
Replies
Boosts
Views
Activity
I am working on implementing Image Based Lighting in a ray tracing project. In order to get the sampling to work predictably, I will need to load and process an HDR image into a MTLTexture.
While using a MTKTextureLoader to load .jpg and .png files has been super-smooth, loading a .hdr file in Swift seems to have a few barriers.
I have tried to follow the Processing HDR Images with Metal sample code [ Objective C ], but it relies on some finessing of pointers that I can't duplicate in Swift.
Is there currently a best way to move an HDR image into a Metal texture using Swift?
Thanks so much!
While translating the Accelerating Ray Tracing Using Metal sample project into Swift, I have run into an issue within the createAccelerationStructures function.
I am trying to fill in the first three rows of the instance transformation matrix. In the Objective C example, it looks like:
for (int column = 0; column < 4; column++)
	for (int row = 0; row < 3; row++)
		instanceDescriptors[instanceIndex].transformationMatrix.columns[column][row] = instance.transform.columns[column][row];
The matrix targeted is a MTLPackedFloat4x3. It has defied me pulling out the needed elements from my instance transform and placing them in the descriptor. I have tried the obvious:
for column in 0..<( 4 )
	{
	for row in 0..<( 3 )
		{
		anInstanceDescriptorPointer.pointee.transformationMatrix.columns[column][row] = aNodeInstance.transform.columns[column][row]
		}
	}
I have tried more obscure ideas related to simd matrices and Swift. The compiler errors generally warn me that MTLPackedFloat4x3 has no subscripts.
Question - Is there an accepted way to assign three rows from the instance transform to the descriptor transformationMatrix in Swift?
Thank you for your earlier help with all of this. I should mention that the new intersector feature in Metal has worked really well for me when feeding it a primitiveaccelerationstructure. Very elegant! But using instances seems to offer more flexibility going forward.
Thank you very much!
I have enjoyed looking through the 'Discover Ray Tracing with Metal' video and Sample Code. While trying to recreate the Project in Swift, I have run across an issue with setting up an MTLPrimativeAccelerationStructureDescriptor.
In Renderer.mm ( Objective C ), within the createAccelerationStructures function, a loop is created:
// Create a primitive acceleration structure for each piece of geometry in the scene
	for (NSUInteger i = 0; i < _scene.geometries.count; i++) {
	Geometry *mesh = _scene.geometries[i];
	MTLAccelerationStructureGeometryDescriptor *geometryDescriptor = [mesh geometryDescriptor];
	// Assign each piece of geometry a consecutive slot in the intersection function table
geometryDescriptor.intersectionFunctionTableOffset = i;
	// Create a primitive acceleration structure descriptor to contain the single piece of acceleration structure geometry
	MTLPrimitiveAccelerationStructureDescriptor *accelDescriptor = [MTLPrimitiveAccelerationStructureDescriptor descriptor];
	accelDescriptor.geometryDescriptors = @[ geometryDescriptor ];
	// Build the acceleration structure.
	id <MTLAccelerationStructure> accelerationStructure = [self newAccelerationStructureWithDescriptor:accelDescriptor];
	// Add the acceleration structure to the array of primitive acceleration structures.
	[_primitiveAccelerationStructures addObject:accelerationStructure];
	}
In Swift, I am trying:
for i in 0..<( scene.nodes.count )
	{
	let aMesh = scene.nodes[i]
	let geometryDescriptor: MTLAccelerationStructureGeometryDescriptor = aMesh.getGeometryDescriptor()
	// Assign each piece of geometry a consecutive slot in the intersection function table
geometryDescriptor.intersectionFunctionTableOffset = i
	// Create a primitive acceleration structure descriptor to contain the single piece of acceleration structure geometry
	var accelDescriptor: MTLPrimitiveAccelerationStructureDescriptor = MTLPrimitiveAccelerationStructureDescriptor()
	accelDescriptor.geometryDescriptors.append( geometryDescriptor )
	// Build the acceleration structure.
	// To follow...
	// Add the acceleration structure to the array of primitive acceleration structures.
	 // To follow...
	}
The compiler flags appending the geometryDescriptor with "Cannot use mutating member on immutable value: 'accelDescriptor is immutable'". I have tried a couple of compiler suggested ideas to unwrap the accelDescriptor.geometryDescriptors, but end up with a nil value in the geometryDescriptors array.
It may be naive to simply append the geometryDescriptor, but I would appreciate any suggestions to fill in the accelDescriptor.
In the larger picture, it would be great to have a Swift Project sample to use as a starting point. The concepts spelled out in the video and Objective C project are very compelling!
Thanks so much - John Lobe