Graphics 金属混合α值低于0.5

Graphics 金属混合α值低于0.5,graphics,metal,Graphics,Metal,当我尝试与alpha为0.5或更低的颜色混合时,金属似乎会丢弃该颜色,就像它的alpha为0一样。当我将alpha设置为0.51时,我可以很好地看到它。当我将其设置为0.5时,它是不可见的。以下是该问题的一个简单实现: @实现渲染器 { id_装置; id_命令队列; 图书馆id; id_vertexBuffer; id_indexBuffer; id_管道状态; } -(非Null instancetype)initWithMetalKitView:(非Null MTKView*)视图; {

当我尝试与alpha为0.5或更低的颜色混合时,金属似乎会丢弃该颜色,就像它的alpha为0一样。当我将alpha设置为0.51时,我可以很好地看到它。当我将其设置为0.5时,它是不可见的。以下是该问题的一个简单实现:

@实现渲染器
{
id_装置;
id_命令队列;
图书馆id;
id_vertexBuffer;
id_indexBuffer;
id_管道状态;
}
-(非Null instancetype)initWithMetalKitView:(非Null MTKView*)视图;
{
self=[super init];
如果(自我)
{
_设备=view.device;
view.colorPixelFormat=MTLPixelFormatBGRA8Unorm\u sRGB;
_commandQueue=[[u设备队列];
[self_createRenderObject];
}
回归自我;
}
-(无效)_createRenderObject
{
顶点顶点[4]={
simd_make_float2(-0.5f,-0.5f),
simd_make_float2(0.5f,-0.5f),
simd_make_float2(0.5f,0.5f)
};
uint16_t指数[3]={0,1,2};
_vertexBuffer=[\u设备newBufferWithBytes:&顶点长度:sizeof(顶点)选项:MTLResourceStorageModeShared];
_indexBuffer=[\u设备newBufferWithBytes:&索引长度:sizeof(索引)选项:MTLResourceStorageModeShared];
//创建管道状态
defaultLibrary=[\u设备新建defaultLibrary];
MTLRenderPipelineDescriptor*pd=[[MTLRenderPipelineDescriptor alloc]init];
pd.vertexFunction=[defaultLibrary newFunctionWithName:@“VertShader”];
pd.fragmentFunction=[defaultLibrary newFunctionWithName:@“FragShader”];
pd.alphaToCoverageEnabled=是;
MTLRenderPipelineColorAttachmentDescriptor*cad=pd.colorAttachments[0];
cad.pixelFormat=MTLPixelFormatBGRA8Unorm\u sRGB;
cad.blendingEnabled=是;
cad.alphaBlendOperation=MTLBlendOperationAdd;
cad.sourceAlphaBlendFactor=MTLBlendFactorSourceAlpha;
cad.destinationAlphaBlendFactor=MTLBlendFactorDestinationAlpha;
cad.rgbblendooperation=mtlblendooperationadd;
cad.sourceRGBBlendFactor=MTLBlendFactorSourceAlpha;
cad.destinationRGBBlendFactor=mtlblendfactor-eminusourcealpha;
n错误*错误=NULL;
_pipelineState=[\u设备newRenderPipelineStateWithDescriptor:pd错误:&错误];
}
-(void)drawInMTKView:(非空MTKView*)视图
{
id commandBuffer=[\u commandQueue commandBuffer];
MTLRenderPassDescriptor*renderPassDescriptor=view.currentRenderPassDescriptor;
id渲染器=
[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
[RenderCoder SetFrontFacing Winding:MTLwinding逆时针];
[RenderCoder setCullMode:MTLCullModeBack];
[RenderCoder setRenderPipelineState:_pipelineState];
[RenderCoder setVertexBuffer:_vertexBuffer偏移量:0索引:0];
[RenderCoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
指数计数:3
索引类型:mtlindextypeunit16
indexBuffer:_indexBuffer
indexBufferOffset:0];
[渲染器编码];
[commandBuffer presentDrawable:view.currentDrawable];
[命令缓冲区提交];
}
@结束
Shader.metal:

typedef结构{
浮动4位[[位]];
}顶点输出;
顶点顶点输出
顶点着色器(const uint vertexID[[vertex_id]],
常数顶点*顶点[[缓冲区(0)])
{
垂直输出;
顶点v=顶点[vertexID];
out.position=(float4){v.position.x,v.position.y,0,1};
返回;
}
片段半4
FragShader(VertexOut in[[stage_in]]
{
返回半4(1,1,1,0.50f);
}
有了这些代码,特别是以0.50f作为alpha值的FragShader,我得到了一个空白画布:

如果我将alpha值更改为0.51f:

fragment half4
FragShader(VertexOut in[[stage_in]]
{
返回半4(1,1,1,0.51f);
}
然后我得到这个:


感谢您的帮助

已解决。问题是设置为true,而渲染目标纹理类型未设置为true。看起来这两种方法是协同工作的,但我无法理解它们是如何工作的

如果不使用多重采样,请将alphaToCoverageEnabled设置为false

否则,请确保渲染目标的类型为MTLTextureType2DMultisample

如果使用MTKView,请通过在MTKView对象上设置来设置渲染目标纹理类型:

\u view=(MTKView*)self.view;
_view.sampleCount=2;
以及管道状态的渲染管道描述符:

MTLRenderPipelineDescriptor*pd=[[MTLRenderPipelineDescriptor alloc]init];
pd.sampleCount=2;

在我听来,您在某个地方启用了“alpha测试”,将alpha测试阈值设置为0.5,虽然没有使用金属,但我不能确定。也许你可以试着问一下?谢谢你@simon-f,你的建议让我找到了答案。