Я получил следующее сообщение при профилировании в xcode.Это предполагает, что я использую 32-битную с плавающей точкой.В любом случае для меня нет проблем использовать 16-битную точность с плавающей запятой.но если я сделаю это, это показывает ошибку.
Как я могу улучшить производительность, следующая функция шейдера.Для выборки текстуры мы можем использовать функцию half4.
struct VertexOutCalculatedTextureBezier {
float4 pos[[position]];
float4 color;
float2 textureCoordinates;
int8_t index;
};
struct BezierCalParameters
{
float2 a;
float angle;
float size;
int8_t index;
};
Vertex Shader, которая предлагается при профилировании
vertex VertexOutCalculatedTextureBezier bezier_calculated_vertex_texture(constant BezierCalParameters *allParams[[buffer(0)]],
uint vertexId [[vertex_id]],
uint instanceId [[instance_id]])
{
BezierCalParameters params = allParams[instanceId];
VertexOutCalculatedTextureBezier vo;
vo.pos.xy = params.a;
if(vertexId % 4 == 0){
vo.pos.x = params.a.x + params.size * sinpi(params.angle) ;
vo.pos.y = params.a.y - params.size * cospi(params.angle);
vo.textureCoordinates = float2(0,0);
vo.index = params.index ;
}else if(vertexId % 4 == 1){
vo.pos.x = params.a.x + params.size * cospi(params.angle);
vo.pos.y = params.a.y + params.size * sinpi(params.angle);
vo.textureCoordinates = float2(0,1);;
vo.index = params.index ;
}
else if(vertexId % 4 == 2){
vo.pos.x = params.a.x - params.size * cospi(params.angle) ;
vo.pos.y = params.a.y - params.size * sinpi(params.angle);
vo.textureCoordinates = float2(1,0);
vo.index = params.index ;
}
else if(vertexId % 4 == 3){
vo.pos.x = params.a.x - params.size * sinpi(params.angle);
vo.pos.y = params.a.y + params.size * cospi(params.angle) ;
vo.textureCoordinates = float2(1,1);
vo.index = params.index ;
}
vo.pos.zw = float2(0, 1);
return vo;
}
Функция фрагмента, соответствующая этой функции
fragment half4 bezier_fragment_calculated_texture(VertexOutCalculatedTextureBezier params[[stage_in]],
texture2d<float, access::sample>texture [[texture(0)]],
texture2d<float, access::sample> texture2 [[texture(1)]],
texture2d<float, access::sample> texture3 [[texture(2)]])
{
constexpr sampler defaultSampler;
if(params.index == 0) {
float4 color =texture.sample(defaultSampler, params.textureCoordinates) * float4(1,0,0,0.68);
return half4(color);
}else if(params.index == 1) {
float4 color =texture2.sample(defaultSampler, params.textureCoordinates) * float4(1,0,0,0.68);
return half4(color);
}else if(params.index == 2) {
float4 color =texture3.sample(defaultSampler, params.textureCoordinates) * float4(1,0,0,0.68);
return half4(color);
}
float4 color =texture.sample(defaultSampler, params.textureCoordinates) * float4(1,0,0,0.68);
return half4(color);
}