gpt4 book ai didi

metal - 如何使用 Metal 着色器语言中的引用参数定义函数,顶点、片段和内核函数除外

转载 作者:行者123 更新时间:2023-12-05 03:02:38 32 4
gpt4 key购买 nike

将一些基本的 OpenGL ES 2.0 着色器移植到 Metal 着色器时,我不知道如何将 glsl 中的 in/inout/out 限定符转换为 Metal 着色器语言 (MSL)。例如,

//OpenGL vertex shader

...

void getPositionAndNormal(out vec4 position, out vec3 normal, out vec3 tangent, out vec3 binormal)
{
position = vec4(1.0, 0.0, 1.0, 1.0);
normal = vec3(1.0, 0.0, 1.0);
tangent = vec3(1.0, 0.0, 1.0);
binormal = vec3(1.0, 0.0, 1.0);
}

void main()

{
...

vec4 position;
vec3 normal;
vec3 tangent;
vec3 binormal;
getPositionAndNormal(position, normal, tangent, binormal);

...
}

尝试转换为 MSL 时,我尝试在 getPositionAndNormal 参数中使用引用:

void getPositionAndNormal(float4 & position, float3 & normal, float3 & tangent, float3 & binormal);

我得到以下编译错误信息:reference type must have explicit address space qualifier

根据 Metal-Shading-Language-Specification.pdf 中的第 4.2 节,我使用设备地址空间以下列形式引用 getPositionAndNormal 参数:

void getPositionAndNormal(device float4 & position, device float3 & normal, device float3 & tangent, device float3 & binormal);

这一次,我收到的错误消息是没有匹配函数来调用“getPositionAndNormal”。

void getPositionAndNormal (
device float4 & position,
device float3 & normal,
device float3 & tangent,
device float3 & binormal)
{
position = float4(1.0, 0.0, 1.0, 1.0);
normal = float3(1.0, 0.0, 1.0);
tangent = float3(1.0, 0.0, 1.0);
binormal = float3(1.0, 0.0, 1.0);
}

vertex ShaderOutput vertexShader (ShaderInput inputMTL [[stage_in]], constant ShaderUniform& uniformMTL [[buffer(1)]])
{
...

float3 binormal = 0;
float3 tangent = 0;
float3 normal = 0;
float4 position = 0;
getPositionAndNormal (position, normal, tangent, binormal);

...
}

执行此操作的正确“Metal ”方法是什么?

最佳答案

vertexShader()中的局部变量在thread地址空间,而不是device地址空间。因此,您也应该将getPositionAndNormal() 的参数声明为thread 地址空间。

device 地址空间用于设备间共享的内容;也就是说,跨所有“线程”或着色器的调用。这些变量特定于每个线程/调用。它们不是共享的。

我怀疑完整的“无匹配函数”编译器错误可以解释声明的参数和实际传递的参数之间的不匹配,尽管可能有点神秘。

关于metal - 如何使用 Metal 着色器语言中的引用参数定义函数,顶点、片段和内核函数除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54665905/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com