iOs에서 Objective-c를 사용하여 Metal 초기화
13085 단어 iOS금속Objective-C
iOs12에서 OpenGLES가 더 이상 사용되지 않으므로 Metal로 이동하기위한 각서
■Step1:프로젝트 작성
프로젝트 작성하면.
화면이 나오므로 "Applocation"은 "Single View App"을 선택하고 "Next"를 누르십시오.
다음에 「Product Name」입니다만 이번은 「Test01」이라고 하고 있습니다(이것은 무엇이든 OK입니다)
언어 설정 "Language"는 "Objective-c"를 설정하십시오.
"Next"를 누르고 디렉토리를 지정하고 "Create"를 누르면 프로젝트를 만들 수 있습니다.
이런 화면이 나옵니다.
■Step2:MetalRenderer 클래스 작성
프로젝트에 "MetalRenderer.m""MetalRenderer.h"를 추가합니다.
MetalRenderer.m
#import "MetalRenderer.h"
static const NSUInteger MaxBuffersInFlight = 3;
@implementation MetalRenderer
{
dispatch_semaphore_t _in_flight_semaphore;
id <MTLDevice> _device;
id <MTLCommandQueue> _command_queue;
}
-(nonnull instancetype)initWithMetalKitView:(nonnull MTKView *)view;
{
if(self = [super init])
{
_device = view.device;
_in_flight_semaphore = dispatch_semaphore_create(MaxBuffersInFlight);
view.colorPixelFormat = MTLPixelFormatBGRA8Unorm;
_command_queue = [_device newCommandQueue];
}
return self;
}
- (void)drawInMTKView:(nonnull MTKView *)view
{
dispatch_semaphore_wait(_in_flight_semaphore, DISPATCH_TIME_FOREVER);
id <MTLCommandBuffer> command_buffer = [_command_queue commandBuffer];
__block dispatch_semaphore_t block_sema = _in_flight_semaphore;
[command_buffer addCompletedHandler:^(id<MTLCommandBuffer> buffer)
{
dispatch_semaphore_signal(block_sema);
}];
MTLRenderPassDescriptor* render_pass_descriptor = view.currentRenderPassDescriptor;
render_pass_descriptor.colorAttachments[0].loadAction=MTLLoadActionClear;
render_pass_descriptor.colorAttachments[0].storeAction=MTLStoreActionStore;
render_pass_descriptor.colorAttachments[0].clearColor=MTLClearColorMake(1.0, 0.0, 0.0, 1.0);
if(render_pass_descriptor != nil)
{
id <MTLRenderCommandEncoder> render_encoder =
[command_buffer renderCommandEncoderWithDescriptor:render_pass_descriptor];
[render_encoder endEncoding];
[command_buffer presentDrawable:view.currentDrawable];
}
[command_buffer commit];
}
- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size
{
}
@end
MetalRenderer.h
#import <MetalKit/MetalKit.h>
@interface MetalRenderer : NSObject <MTKViewDelegate>
-(nonnull instancetype)initWithMetalKitView:(nonnull MTKView *)view;
@end
■Step3:ViewController.m의 편집
ViewController.m
#import "ViewController.h"
#import "MetalRenderer.h"
@implementation ViewController
{
MTKView *_view;
MetalRenderer *_renderer;
}
-(void)viewDidLoad
{
[super viewDidLoad];
_view = (MTKView *)self.view;
_view.device = MTLCreateSystemDefaultDevice();
_view.backgroundColor = UIColor.blackColor;
if(!_view.device)
{
NSLog(@"Metal is not supported on this device");
self.view = [[UIView alloc] initWithFrame:self.view.frame];
return;
}
_renderer = [[MetalRenderer alloc] initWithMetalKitView:_view];
[_renderer mtkView:_view drawableSizeWillChange:_view.bounds.size];
_view.delegate = _renderer;
}
@end
■Step4:View 설정
스토리보드에서 View로 설정합니다.
Main.storyboad에서 View를 선택합니다.
그러면 오른쪽에 Class를 설정하는 곳이 나오므로 거기에 「MTKView」를 지정해 주세요.
■Step5:실행
메탈을 시뮬레이터에서는 실행할 수 없기 때문에, 실기에서의 확인을 부탁합니다.
빨간 화면이 나옵니다
Reference
이 문제에 관하여(iOs에서 Objective-c를 사용하여 Metal 초기화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sanoh/items/f123306bd347764fcac4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)