Глубина трафарета не работает - PullRequest
0 голосов
/ 03 июля 2018

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

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

Возможно, я неправильно настроил 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>

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

enter image description here

1 Ответ

0 голосов
/ 03 июля 2018

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

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

<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

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

...