我有一个RGBA8Unorm格式的MTLTexture和一个BGRA8Unorm格式(反转)的屏幕纹理(在MTKView中)。在Metal着色器中,当我使用sample()从该纹理采样时,得到的是float4。当我在金属材质球中写入纹理时,我也会写入float4。似乎当我位于着色器代码中时,float4始终代表分量RGBA的相同顺序,而不管纹理的原始格式如何(红色[0],绿色[1],蓝色[2]和[ 3]。我的结论正确吗,无论纹理的存储格式是什么,采样/编写的float4的成分的含义总是相同[[在着色器内?更新:我使用以下代码以RGBA8Unnorm格式写入纹理:
kernel void
computeColourMap(constant Uniforms &uniforms [[buffer(0)]],
constant array<float, 120> &s [[buffer(1)]],
constant array<float, 120> &red [[buffer(2)]],
constant array<float, 120> &green [[buffer(3)]],
constant array<float, 120> &blue [[buffer(4)]],
texture2d<float, access::write> output [[texture(0)]],
uint2 id [[thread_position_in_grid]])
{
if (id.x >= output.get_width() || id.y >= output.get_height()) {
return;
}
uint i = id.x % 120;
float4 col (0, 0, 0, 1);
col.x += amps[i] * red[i];
col.y += amps[i] * green[i];
col.z += amps[i] * blue[i];
output.write(col, id);
}
然后我在渲染阶段使用以下着色器:
vertex VertexOut
vertexShader(const device VertexIn *vertexArray [[buffer(0)]],
unsigned int vid [[vertex_id]])
{
VertexIn vertex_in = vertexArray[vid];
VertexOut vertex_out;
vertex_out.position = vertex_in.position;
vertex_out.textureCoord = vertex_in.textureCoord;
return vertex_out;
}
fragment float4
fragmentShader(VertexOut interpolated [[stage_in]],
texture2d<float> colorTexture [[ texture(0) ]])
{
const float4 colorSample = colorTexture.sample(nearestSampler,
interpolated.textureCoord);
return colorSample;
}
其中colourTexture
传递到片段着色器中的是我以RGBA8Unorm格式生成的,在Swift中我具有:
let renderPipelineDescriptor = MTLRenderPipelineDescriptor()
renderPipelineDescriptor.vertexFunction = library.makeFunction(name: "vertexShader")!
renderPipelineDescriptor.fragmentFunction = library.makeFunction(name: "fragmentShader")!
renderPipelineDescriptor.colorAttachments[0].pixelFormat = colorPixelFormat
MTKView的colorPixelFormat
是BGRA8Unorm(相对于纹理反转),它与我的纹理不同,但是屏幕上的颜色正确。
更新2:在
在着色器中
由float4表示的颜色始终具有rgba顺序的另一个指针是:float4类型实际上具有称为v.r,v.g,v.b,v.rgb等的访问器] 我有一个RGBA8Unorm格式的MTLTexture和一个BGRA8Unorm格式(反转)的屏幕纹理(在MTKView中)。在Metal着色器中,当我使用sample()从该纹理采样时,得到的是float4。当我...float
。声明纹理时,可以将组件类型指定为模板参数(代码中的texture2d<float ...>
)。