sample()是否始终以金属着色语言返回RGBA格式的float4?

问题描述 投票:0回答:1

我有一个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> &amps [[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。当我...
metal
1个回答
0
投票
向量始终具有4个成分,但是成分的类型不一定是float。声明纹理时,可以将组件类型指定为模板参数(代码中的texture2d<float ...>)。
© www.soinside.com 2019 - 2024. All rights reserved.