我正试图将glsl着色器转换成金属材质,尽管网上有很多备忘单和教程,但我还是想不出如何处理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来进行黑客攻击的(但它真的会影响任何事情吗?但这会影响什么吗?)
发布于 2020-08-06 04:01:31
当使用金属,一些配置,如纹理过滤器和其他不像OpenGL使用GL方法定义它在应用程序的着色器。
要回答关于sample function.This中的第一个参数的确切问题,OpenGL中的纹理筛选函数类似于
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
https://stackoverflow.com/questions/63265384
复制相似问题