ios - Metal中的纹理数组
问题描述
fragment half4 fragmen_shader_test(WaterColorCloudOut params[[stage_in]],
texture2d<float , access::sample>cloud1 [[texture(0)]],
texture2d<half, access::sample> cloud2 [[texture(1)]],
texture2d<half, access::sample> cloud3 [[texture(2)]]
)
{
constexpr sampler defaultSampler;
float4 color1;
if(params.index == 0){
color1= float4(cloud1.sample(defaultSampler, float2(params.textureCoordinates))) * params.color ;
}
else if(params.index == 1){
color1= float4(cloud2.sample(defaultSampler, float2(params.textureCoordinates))) * params.color ;
} else{
color1= float4(cloud3.sample(defaultSampler, float2(params.textureCoordinates))) * params.color ;
}
return half4(color1);
}
在这里,我使用了三种纹理,因为 If-else 条件会随着时间的推移而下降。我觉得如果我将纹理数组发送到着色器,则无需执行 if else 语句。在 CPU 中,我有三个 MTLTexture。如何将三个纹理绑定到一个数组并将其传递给着色器。
在 CPU 方面,我创建了三个纹理并创建了一个 MTLTexture 数组
var textureArray:[MTLTexture] = []
然后我将纹理附加到该数组。在 MTLRenderCommandEncoder
let myRange: CountableRange = 0..<2
commandEncoder.setFragmentTextures(textureArray, range: myRange)
在着色器中
texture2d_array<float , access::sample> texture [[ texture(0) ]]
在着色器中采样时
float4 color = texture.sample(defaultSampler, float2(params.textureCoordinates),0) * float4(1,0,0,1.0);
我目前正在这样做但我无法获得正确的纹理输出
解决方案
您不必更改应用程序代码。由于您使用的是连续的纹理索引,因此您只需将三个单独的参数替换为绑定到索引 0 的单个纹理数组参数,并且绑定会将数组的元素与您从应用程序代码提供的纹理连接起来。
换句话说,如果您声明一个大小为 3 的纹理数组并绑定到纹理索引 0,则该数组的元素取自纹理索引 0、1 和 2。
更新您编辑的问题:
您混淆了纹理数组(也称为纹理数组)和数组纹理。该术语令人困惑。
- 阵列纹理是其中包含多个 2D 平面的单个纹理。所有平面都具有相同的大小和像素格式。在着色器编译时不必知道纹理中的平面数量。
- 纹理数组是独立纹理的数组,可能具有不同的大小或像素格式。数组的长度是编译时常量。
你用过texture2d_array<...>
。那是一个数组纹理。
对于纹理数组或纹理数组,您应该使用array<texture2d<float, access::sample>, 3> clouds [[texture(0)]]
.
要从数组中的纹理采样,您首先索引数组,然后在该元素上调用纹理函数:
float4 color = clouds[params.index].sample(defaultSampler, float2(params.textureCoordinates)) * float4(1,0,0,1.0);
推荐阅读
- python - Python Pandas 中 DataFrame 的聚合?
- java - 无法运行@Advice catch 异常块
- python-3.x - Discord 如何在没有新授权的情况下获得无限的 Spotify 代币?
- direct2d - ID2D1DeviceContext::CreateBitmap 的哪个参数有误?
- composer-php - Composer php 错误 - 应为以下之一:'STRING'、'NUMBER'、'NULL'、'TRUE'、'FALSE'、'{'、'['
- algorithm - 内循环为 j < i 的嵌套循环的时间复杂度是多少?
- python - Itertools 排列组合与固定放置
- python-3.x - Pyspark在用0替换null时出错
- javascript - 多个输入内的多个输入表单
- wcf - 由于 WCF 服务中的 HTTPS 更改导致应用程序流中的 TLS 问题