ROV のテストで用いたシェーダーはそのまま Metal でも動きました。
↑上記は iPod touch 6 (A8) の結果です。
左が DepthTest 無しの通常の RenderTarget の内容、
右がバッファをソートした結果。
iOS のみです。Metal というより PowerVR の機能です。
fragment PS_OUT pmain(
VS_OUT pin [[stage_in]],
constant GeometryBuffer& geometry [[buffer(1)]],
half4 rcolor [[color(0)]],
float4 zstack [[color(1)]],
uint4 stack [[color(2)]]
)
{
PS_OUT pout;
half3 Light= normalize( half3( 0.0h, -0.5h, -1.0h ) );
half3 normal= normalize( half3(pin.Normal) );
half3 eyevec= normalize( half3( 0.0h, 0.0h, -120.0h ) - half3(pin.WPos.xyz) );
half3 hvect= normalize( eyevec.xyz + Light.xyz );
half3 spec= pow( saturate( dot( hvect, normal ) ), 82.0h ) * saturate( half3(geometry.Color.xyz) + half3( 0.6h, 0.6h, 0.6h ) );
half diffuse= saturate( max( dot( normal, Light ), 0.0h ) + 0.2h );
half4 color;
color.xyz= half3(geometry.Color.xyz) * diffuse + spec;
color.w= half(geometry.Color.w);
uint color_enc= EncodeColor( color );
float pz= pin.Position.z;
if( pz < zstack.w ){
zstack.w= pz;
stack.w= color_enc;
}
if( pz < zstack.z ){
zstack.w= zstack.z;
stack.w= stack.z;
zstack.z= pz;
stack.z= color_enc;
}
if( pz < zstack.y ){
zstack.z= zstack.y;
stack.z= stack.y;
zstack.y= pz;
stack.y= color_enc;
}
if( pz < zstack.x ){
zstack.y= zstack.x;
stack.y= stack.x;
zstack.x= pz;
stack.x= color_enc;
}
pout.Color= color;
pout.Color1= zstack;
pout.Color2= stack;
return pout;
}
関連エントリ
・Direct3D12 ROV を試してみる (3) 半透明ソートと Intel HD Graphics
・Direct3D12 ROV を試してみる (2) Depth Test と半透明ソート
・Direct3D12 ROV (Rasterizer Order View) を試してみる
・3D 低レベル API の違い Direct3D 12/Metal
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・3D 低レベル API の現状 Direct3D 12/Metal