试图与 Opengl 纹理共享金属纹理
Trying to share Metal texture with Opengl texture
我查看了文档,但我不知道如何获取纹理ID。
我实际上是从 SDK 获取金属纹理,我想与 Ogre Texture 共享它。我的问题 该代码编译但我不知道如何获取纹理 ID,以便我可以将它用于 Ogre 来渲染它。代码崩溃了,根本不起作用。我花了很多时间来构造它。希望有人能节省我的时间。
例如,它现在在这一行崩溃,但是 ioSurface 已初始化
id<MTLTexture> metalTexture = [device newTextureWithDescriptor:textureDescriptor
ioSurface:surface
plane:0];
发送到实例的选择器无法识别
--
void* texPtr = SixDegreesSDK_GetBackgroundTexture();
if (texPtr != nil) {
id<MTLTexture> mtlTexture = (__bridge id<MTLTexture>)texPtr;
id<MTLDevice> device = [mtlTexture device];
// !!! Not fond of creating a new command queue for every texture
id<MTLCommandQueue> commandQueue = [device newCommandQueue];
id<MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
NSUInteger textureWidth = mtlTexture.width;
NSUInteger textureHeight = mtlTexture.height;
NSUInteger rowbytes = mtlTexture.bufferBytesPerRow;
MTLPixelFormat pixFormat = mtlTexture.pixelFormat;
CVPixelBufferRef _CVPixelBuffer = NULL;
NSDictionary* cvBufferProperties = @{
(__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,
(__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES,
};
CVReturn cvret = CVPixelBufferCreate(kCFAllocatorDefault,
textureWidth, textureHeight,
kCVPixelFormatType_32RGBA,
(__bridge CFDictionaryRef)cvBufferProperties,
&_CVPixelBuffer);
const IOSurfaceRef surface = CVPixelBufferGetIOSurface(_CVPixelBuffer); // available in ios11 sdk, ios4 runtime
MTLTextureDescriptor* textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:pixFormat
width:textureWidth
height:textureHeight
mipmapped:NO];
id<MTLTexture> metalTexture = [device newTextureWithDescriptor:textureDescriptor
ioSurface:surface
plane:0];
MTLRegion region = MTLRegionMake2D(0, 0, textureWidth, textureHeight);
[blitEncoder copyFromTexture:mtlTexture
sourceSlice:0
sourceLevel:0
sourceOrigin:region.origin
sourceSize:region.size
toTexture:metalTexture
destinationSlice:0
destinationLevel:0
destinationOrigin:region.origin];
[blitEncoder endEncoding];
[commandBuffer commit];
[self.mEAGLContext texImageIOSurface:surface target:GL_TEXTURE_2D internalFormat:GL_RGBA width:textureWidth height:textureHeight format:GL_RGBA type:GL_UNSIGNED_BYTE plane:0];
我相信你想要的是CVOpenGLTextureGetName
。我相信这个 returns 您传递给它的纹理的纹理 ID。
我查看了文档,但我不知道如何获取纹理ID。 我实际上是从 SDK 获取金属纹理,我想与 Ogre Texture 共享它。我的问题 该代码编译但我不知道如何获取纹理 ID,以便我可以将它用于 Ogre 来渲染它。代码崩溃了,根本不起作用。我花了很多时间来构造它。希望有人能节省我的时间。
例如,它现在在这一行崩溃,但是 ioSurface 已初始化
id<MTLTexture> metalTexture = [device newTextureWithDescriptor:textureDescriptor
ioSurface:surface
plane:0];
发送到实例的选择器无法识别
--
void* texPtr = SixDegreesSDK_GetBackgroundTexture();
if (texPtr != nil) {
id<MTLTexture> mtlTexture = (__bridge id<MTLTexture>)texPtr;
id<MTLDevice> device = [mtlTexture device];
// !!! Not fond of creating a new command queue for every texture
id<MTLCommandQueue> commandQueue = [device newCommandQueue];
id<MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
NSUInteger textureWidth = mtlTexture.width;
NSUInteger textureHeight = mtlTexture.height;
NSUInteger rowbytes = mtlTexture.bufferBytesPerRow;
MTLPixelFormat pixFormat = mtlTexture.pixelFormat;
CVPixelBufferRef _CVPixelBuffer = NULL;
NSDictionary* cvBufferProperties = @{
(__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,
(__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES,
};
CVReturn cvret = CVPixelBufferCreate(kCFAllocatorDefault,
textureWidth, textureHeight,
kCVPixelFormatType_32RGBA,
(__bridge CFDictionaryRef)cvBufferProperties,
&_CVPixelBuffer);
const IOSurfaceRef surface = CVPixelBufferGetIOSurface(_CVPixelBuffer); // available in ios11 sdk, ios4 runtime
MTLTextureDescriptor* textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:pixFormat
width:textureWidth
height:textureHeight
mipmapped:NO];
id<MTLTexture> metalTexture = [device newTextureWithDescriptor:textureDescriptor
ioSurface:surface
plane:0];
MTLRegion region = MTLRegionMake2D(0, 0, textureWidth, textureHeight);
[blitEncoder copyFromTexture:mtlTexture
sourceSlice:0
sourceLevel:0
sourceOrigin:region.origin
sourceSize:region.size
toTexture:metalTexture
destinationSlice:0
destinationLevel:0
destinationOrigin:region.origin];
[blitEncoder endEncoding];
[commandBuffer commit];
[self.mEAGLContext texImageIOSurface:surface target:GL_TEXTURE_2D internalFormat:GL_RGBA width:textureWidth height:textureHeight format:GL_RGBA type:GL_UNSIGNED_BYTE plane:0];
我相信你想要的是CVOpenGLTextureGetName
。我相信这个 returns 您传递给它的纹理的纹理 ID。