-
[MTL] MTLTextureiOS/Metal 2024. 8. 20. 19:38
A resource that holds formatted image data.
'GPU에서 처리할 수 있도록 정제된 이미지 정보를 갖고 있는 자원'을 추상화시켜 놓은 객체입니다.
이 프로토콜을 직접 구현하지 말고 주어진 instance 생성 메서드들을 이용해서 생성해야 합니다 !
Don’t implement this protocol yourself; instead, use one of the following methods to create a MTLTexture instance
1. MTLTextureDescriptor 이용하기
descriptor to texture
MTLTextureDescriptor를 만들고 MTLDevice의 makeTexture(descriptor:) 를 사용해 texture를 생성할 수 있습니다.
텍스처의 크기나 형식을 커스터마이징해야 하거나, 복잡한 렌더링 파이프라인에 사용될 텍스처를 생성할 때 적합합니다.let textureDescriptor = MTLTextureDescriptor() textureDescriptor.pixelFormat = .rgba8Unorm textureDescriptor.width = 512 textureDescriptor.height = 512 textureDescriptor.usage = [.shaderRead, .shaderWrite] let texture = device.newTexture(descriptor: textureDescriptor)
texture data 를 갖고 있는 IOSurface 가 이미 있다면 makeTexture(descriptor:iosurface:plane:) 를 사용합니다.
2. MTLTextureLoader 사용하기
image to texture
MTKTextureLoader를 사용해 image data 를 texture 로 만들 수 있습니다.
func loadTextureUsingMetalKit(url: URL, device: MTLDevice) throws -> MTLTexture { let loader = MTKTextureLoader(device: device) return try loader.newTexture(URL: url, options: nil) } let textureURL = Bundle.main.url(forResource: "image", withExtension: "png")! let texture = loadTextureUsingMetalKit(url: textureURL, device: device)
3. makeTextureView 이미 존재하는 texture 에서 새로운 texture 만들기
texture to texture
이미 존재하는 texture 에서 새로운 texture를 생성할 수 있습니다.
원래 텍스처와 같은 데이터를 공유하지만, 다른 픽셀 포맷(Red 8-bit)으로 접근하는 텍스처 뷰를 생성할 수 있습니다.
let textureView = texture.makeTextureView(pixelFormat: .r8Unorm)
4. MTLDrawable.texture 사용하기
drwable to texture
MTLDrawable은 렌더링 결과를 화면에 표시하기 위한 객체로 랜더링 결과를 texture로 사용할 때 사용합니다.
한번 생성되면 크기, 타입, 픽셀 포멧 등 대부분의 정보는 불변하며,
오직 pixel data만 변경 가능합니다.시스템 메모리의 픽셀 데이터를 텍스쳐로 복사하려면 replace 메서드를,
픽셀 데이터를 시스템 메모리로 다시 복사하려면 getBytes 를 사용합니다.Reference
- https://developer.apple.com/documentation/metal/mtltexture
- https://developer.apple.com/documentation/metalkit/mtktextureloader
'iOS > Metal' 카테고리의 다른 글
[Metal] MTKView > Drawing Mode (Configuring the Drawing Behavior) (0) 2023.04.05