Трафарет глубины металла не работает

У меня есть проект MetalKit на MacOS, где все работает, как ожидалось, за исключением трафарета глубины.

Поскольку я смог найти только примеры трафарета глубины для iOS, я следую за ними. Приведенный ниже фрагмент вызывается сразу после создания конвейера рендеринга, но возвращаемое значение из newDepthStencilStateWithDescriptor кажется недопустимым (устройство и метка равны нулю).

Возможно, я неправильно настроил MTKView, но я не могу быть уверен, потому что нет примеров трафарета глубины с использованием MTKView и MacOS.

Если бы кто-нибудь мог объяснить, как это могло произойти, как я мог бы отладить это или есть ли у них пример кода, который я мог бы сравнить с этим, было бы здорово.

desc := MTLDepthStencilDescriptor.alloc.init.autorelease;
desc.setDepthCompareFunction(MTLCompareFunctionLess);
desc.setDepthWriteEnabled(true);
desc.setLabel(NSSTR('MY DEPTH STENCIL'));

depthStencilState := device.newDepthStencilStateWithDescriptor(desc);

<MTLDepthStencilDescriptorInternal: 0x1003153a0>
    label = MY DEPTH STENCIL 
    depthCompareFunction = MTLCompareFunctionLess 
    depthWriteEnabled = 1 
    frontFace: 
        stencilCompareFunction        = MTLCompareFunctionAlways 
        stencilFailOperation          = MTLStencilOperationKeep 
        stencilPassDepthFailOperation = MTLStencilOperationKeep 
        stencilPassDepthPassOperation = MTLStencilOperationKeep 
        stencilReadMask               = 0xffffffff 
        stencilWriteMask              = 0xffffffff 
    backFace: 
        stencilCompareFunction        = MTLCompareFunctionAlways 
        stencilFailOperation          = MTLStencilOperationKeep 
        stencilPassDepthFailOperation = MTLStencilOperationKeep 
        stencilPassDepthPassOperation = MTLStencilOperationKeep 
        stencilReadMask               = 0xffffffff 
        stencilWriteMask              = 0xffffffff
<MTLIGDepthStencilState: 0x1003241d0>
    label = <none> 
    device = <null>

Обратите внимание, что трафарет глубины не работает и фрагменты рисуются в неправильном порядке.

введите описание изображения здесь


person GenericPtr    schedule 02.07.2018    source источник
comment
Какая версия macOS? Вы показываете описания объектов, их самоописания (например, -debugDescription или отформатированные с помощью %@), или вы сбрасываете их с помощью специального кода? Вы устанавливаете объект состояния трафарета глубины в кодировщике команды рендеринга? Вы работаете с включенным слоем проверки Metal? (Xcode включает его по умолчанию, но я не знаю, используете ли вы Xcode.)   -  person Ken Thomases    schedule 03.07.2018
comment
10.13, и я получаю этот результат сразу после создания представления до того, как будет настроен какой-либо конвейер (для тестирования), но я не использую Xcode или Swift / Objc, поэтому, возможно, что-то еще не работает. Не знаю, что исключать на данном этапе. Я тестировал несколько примеров Swift, и у меня не возникало этой проблемы, то есть печать depthStencilState дает разумные результаты: ‹MTLDebugDepthStencilState: 0x60000026a040› - ›‹ MTLIGDepthStencilState: 0x600000242310 ›label = ‹none› device = ‹null›InitleDescriptorStencil : 0x6000002425b0 ›label = FOO .....   -  person GenericPtr    schedule 03.07.2018
comment
Вы знаете, как включить Metal Validation без Xcode? Я подозреваю, что проблема в том, что эта странная распечатка MTLDebugDepthStencilState, но, возможно, проверка Metal не работает, но я не вижу никаких ошибок.   -  person GenericPtr    schedule 03.07.2018
comment
Установите для переменной среды METAL_DEVICE_WRAPPER_TYPE значение 1.   -  person Ken Thomases    schedule 03.07.2018
comment
Спасибо, Кен, с этим включением я получаю согласованный вывод на печать с проектами Xcode, с которыми я тестировал. Трафарет глубины все еще не работает, но, возможно, это из-за шейдера (см. Мой ответ).   -  person GenericPtr    schedule 03.07.2018


Ответы (1)


Причина, по которой я получал несогласованный вывод, заключается в том, что в тестируемых мной проектах Xcode была включена проверка Metal Validation, а в моем проекте этого не было. Если я включу проверку, значения будут согласованными.

При включенной проверке возвращается тот же код:

<MTLDebugDepthStencilState: 0x100758d40> -> <MTLIGDepthStencilState: 0x1007582a0>
    label = <none> 
    device = <null><MTLDepthStencilDescriptorInternal: 0x100758e20>
        label = MY DEPTH STENCIL 
        depthCompareFunction = MTLCompareFunctionLess 
        depthWriteEnabled = 1 
        frontFace: <MTLStencilDescriptorInternal: 0x100758f60>
            stencilCompareFunction        = MTLCompareFunctionAlways 
            stencilFailureOperation       = MTLStencilOperationKeep 
            stencilPassDepthFailOperation = MTLStencilOperationKeep 
            stencilPassDepthPassOperation = MTLStencilOperationKeep 
            stencilReadMask               = 0xffffffff 
            stencilWriteMask              = 0xffffffff 
        backFace: <MTLStencilDescriptorInternal: 0x100758f90>
            stencilCompareFunction        = MTLCompareFunctionAlways 
            stencilFailureOperation       = MTLStencilOperationKeep 
            stencilPassDepthFailOperation = MTLStencilOperationKeep 
            stencilPassDepthPassOperation = MTLStencilOperationKeep 
            stencilReadMask               = 0xffffffff 
            stencilWriteMask              = 0xffffffff

Так что, в конце концов, вся проблема была отвлекающим маневром. Тем не менее, трафарет глубины все еще не работает, поэтому проблема может быть в моих шейдерах или данных вершин.

person GenericPtr    schedule 03.07.2018