从 glsl 移动到金属时如何转换 sampler2D?

how to convert sampler2D when moving from glsl to metal?

我正在尝试将 glsl 着色器转换为金属,尽管互联网上有很多作弊 sheets 和教程,但我无法理解如何处理 sampler2Dtexture 调用。 This cheat sheet 涵盖了很多东西,但是在关于采样器的部分中,它没有显示定义采样器本身(根据类型)。我的下一个尝试是使用 MoltenVK 并尝试将带有采样器的小型 glsl 着色器转换为金属,看看它是如何处理的。

所以这是我的最小 glsl 着色器:

#version 300 es 
in vec4 TexCoord;
out vec4 fragColor;
uniform sampler2D plane[4];

void main()
{
    fragColor = texture(plane[0], TexCoord.xy);
}

这里是来自 MoltenVK 的 MoltenGLShaderConverter 的输出:

#include <metal_stdlib>
#pragma clang diagnostic ignored "-Wparentheses-equality"
using namespace metal;
struct xlatMtlShaderInput {
  float4 TexCoord;
};
struct xlatMtlShaderOutput {
  float4 fragColor [[color(0)]];
};
struct xlatMtlShaderUniform {
  texture2d<float> plane[4];
};
fragment xlatMtlShaderOutput test_frag (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]])
{
  xlatMtlShaderOutput _mtl_o;
  float4 tmpvar_1 = 0;
  tmpvar_1 = _mtl_u.plane[0].sample(_mtlsmp__mtl_u.plane[0], float2((_mtl_i.TexCoord.xy).x, (1.0 - (_mtl_i.TexCoord.xy).y)));
  _mtl_o.fragColor = tmpvar_1;
  return _mtl_o;
}

这里的好处是我实际上了解到 Y 轴是倒置的,但是这个示例使用了 _mtlsmp__mtl_u 而没有定义它。所以我还是不知道sampler怎么定义。

谁能解释我错过了什么?我看到我是如何通过使用 glsl 着色器并将版本设置为 OpenGL ES 3.0 来破解(但它真的会影响任何东西),但这会影响任何东西吗?

使用 Metal 时,某些配置(如纹理过滤器和其他配置)在着色器中定义,这与 OpenGL 使用 GL 方法在应用程序中定义它不同。

回答你关于sample中第一个参数的确切问题function.This类似于OpenGL中的纹理过滤功能

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);