Оптимизация в шейдерах - PullRequest
       21

Оптимизация в шейдерах

0 голосов
/ 14 сентября 2018

Я получил следующее сообщение при профилировании в xcode.Это предполагает, что я использую 32-битную с плавающей точкой.В любом случае для меня нет проблем использовать 16-битную точность с плавающей запятой.но если я сделаю это, это показывает ошибку.enter image description here

Как я могу улучшить производительность, следующая функция шейдера.Для выборки текстуры мы можем использовать функцию 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);
}
...