как сконвертировать sampler2D при переходе с glsl на металл? - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь преобразовать шейдер glsl в металл, и хотя есть много шпаргалок и руководств по inte rnet, я не могу понять, что делать с sampler2D и texture звонки. В этой шпаргалке было много материала, но в разделе о сэмплерах не показано, как определить сам сэмплер (в терминах типа). Моей следующей попыткой было взять MoltenVK и попытаться преобразовать небольшой шейдер glsl с семплером в металл, чтобы посмотреть, как он с этим справится.

Итак, вот мой минимальный шейдер glsl:

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

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

вот результат MoltenGLShaderConverter из MoltenVK:

#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 без его определения. Так что я до сих пор не знаю, как определить сэмплер.

Кто-нибудь может объяснить, что мне не хватает? Я вижу, как я сделал хак (но действительно ли это на что-нибудь влияет), взяв шейдер glsl и установив версию OpenGL ES 3.0, но влияет ли это на что-нибудь?

1 Ответ

1 голос
/ 06 августа 2020

При использовании Metal некоторые конфигурации, такие как фильтр текстур и другие, определены в шейдере, в отличие от OpenGL, который использует методы GL для определения его в приложении.

Чтобы ответить на ваш точный вопрос по первому параметру в sample функция. Аналогично функции фильтра текстур в OpenGL

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

...