从 glsl 移动到金属时如何转换 sampler2D?
how to convert sampler2D when moving from glsl to metal?
我正在尝试将 glsl 着色器转换为金属,尽管互联网上有很多作弊 sheets 和教程,但我无法理解如何处理 sampler2D
和 texture
调用。 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);
我正在尝试将 glsl 着色器转换为金属,尽管互联网上有很多作弊 sheets 和教程,但我无法理解如何处理 sampler2D
和 texture
调用。 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);