Mac에서 Objective-c를 사용하여 Metal 초기화

13164 단어 금속MacObjective-C
최근에 iOs에서 Metal을 잃었기 때문에 Mac에서 Metal의 각서

■Step1:프로젝트 작성



프로젝트 작성하면.

화면이 나오므로 "Applocation"은 "Cocoa App"을 선택하고 "Next"를 누르십시오.

다음에 「Product Name」입니다만 이번은 「Test01」이라고 하고 있습니다(이것은 무엇이든 OK입니다)
언어 설정 "Language"는 "Objective-c"를 설정하십시오.
그리고 「Use Storyboards」에 체크를 잊지 않고
"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
#ifndef MetalRenderer_h
#define MetalRenderer_h

#import <MetalKit/MetalKit.h>

@interface MetalRenderer : NSObject <MTKViewDelegate>

-(nonnull instancetype)initWithMetalKitView:(nonnull MTKView *)view;

@end
#endif /* MetalRenderer_h */

■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();
    if(!_view.device)
    {
        NSLog(@"Metal is not supported on this device");
        self.view = [[NSView 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:실행



빨간 화면이 나타납니다

좋은 웹페이지 즐겨찾기