Я пытаюсь преобразовать шейдер 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, но влияет ли это на что-нибудь?