使用Metal API与Imageblocks模板“隐式实例化”错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Metal API与Imageblocks模板“隐式实例化”错误相关的知识,希望对你有一定的参考价值。

在以下金属性能着色器代码中:

#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;

struct MeshVertex
{
    half3 worldPosition3d;
    half2 cameraPosition2d;
};

kernel void MeshImageblockShader_kernelFunction(
                 imageblock<MeshVertex>                 meshVertex_imageblock,
                 texture2d<float, access::read_write>   trueDepthTexture       [[ texture(0) ]],
        constant float3x3&                              positionInThreadgroup  [[ thread_position_in_threadgroup ]],
                 ushort2                                positionInGrid         [[ threadgroup_position_in_grid ]])
{

    threadgroup_imageblock MeshVertex* meshVertex_threadgroupImageblock = meshVertex_imageblock.data(positionInThreadgroup);
    imageblock_slice<half3> worldPosition3d_slice = meshVertex_imageblock.slice(meshVertex_threadgroupImageblock->worldPosition3d);    
}

我在最后一个代码行上遇到两个错误:

(!) implicit instantiation of undefined template 'metal::imageblock_slice<half __attribute__((ext_vector_type(3))), metal::imageblock_layout_explicit, void>'
(!) too few template arguments for class template 'imageblock_slice'

我正在尝试在https://developer.apple.com/videos/play/tech-talks/603/上关注“Metal 2 on a !! - Imageblocks”的技术谈话示例(代码示例在3:25发给视频。)

我无法使用图像块在互联网上找到任何代码示例。

任何人都可以建议一些示例代码,或告诉我为什么这不编译?

答案

imageblock_slice<T>模板与half3不兼容。

改为imageblock_slice<half4>解决了这个问题。

另一答案

你错过了顶部的#include <metal_imageblocks>

以上是关于使用Metal API与Imageblocks模板“隐式实例化”错误的主要内容,如果未能解决你的问题,请参考以下文章

将纯 Metal-API 与 SceneKit 或 SpriteKit 一起使用

是否有可能直接将 C++ 与 Metal API 一起使用

Metal API随着iOS 10与macOS 10.12新引入的Tessellation特性

何时在 Apple macOS 上使用 Metal 而不是 Accelerate API

如何使用 Metal API 或 Accelerate Framework 绘制裁剪的位图?

METAL渲染是什么?