почему отправка данных RGBA в BGRA pipeDescriptor работает? - PullRequest
0 голосов
/ 17 октября 2019

Мой MTKView находится в BGRA, и я установил свой pipeDescriptor в BGRA, как показано ниже:

pipeDescriptor.colorAttachments.objectAtIndexedSubscript (0) .setPixelFormat (MTLPixelFormatBGRA8Unorm);

1005 *1004* 1005 *1004* 100 *Теперь проблема заключается в том, что если я отправляю данные, закодированные в RGBA (я имею в виду цвет - это 16 байтов, закодированных в
R (4 байта) + G (4 байта) + B (4 байта) + A (4 байта)) к шейдеру ниже, тогда все будет хорошо!
RenderCommandEncoder.setVertexBuffer(LvertexBuffer{buffer}, 0{offset}, 0{atIndex})

и

#include <metal_stdlib>                                                                                         
using namespace metal;                                                                                          

#include <simd/simd.h>                                                                                          

struct VertexIn {                                                                                               
    vector_float4 color;                                                                                        
    vector_float2 pos;                                                                                          
};                                                                                                              

struct VertexOut {                                                                                              
    float4 color;                                                                                               
    float4 pos [[position]];                                                                                    
};                                                                                                              

vertex VertexOut vertexShader(                                                                                  
                              const device VertexIn *vertexArray [[buffer(0)]],                                 
                              unsigned int vid [[vertex_id]],                                                    
                              constant vector_uint2 *viewportSizePointer [[buffer(1)]] 
                             )                                                                                  
{                                                                                                               
    // Get the data for the current vertex.                                                                     
    VertexIn in = vertexArray[vid];                                                                             
    VertexOut out;

    ...  
    out.color = in.color;                                                                                       
    ....                                                                                                                                                                                                                                     
    return out;                                                                                                 
}                                                                                                               

fragment float4 fragmentShader(                                                                                 
                                VertexOut interpolated [[stage_in]],                                             
                                texture2d<half> colorTexture [[ texture(0) ]]                                             
                              )                                                                                 
{                                                                                                               
    return interpolated.color;                                                                                  
}

Как это возможно? это о маленьком и старшем порядке байтов?

1 Ответ

3 голосов
/ 17 октября 2019

Предполагается, что цвета, возвращаемые вами из функции фрагмента, имеют порядок RGBA, независимо от формата пикселей вашей цели рендеринга. Они переполняются и / или конвертируются по мере необходимости в соответствии с форматом пункта назначения. То же самое происходит при выборке / записи других текстур: цвета всегда приходят в порядке RGBA.

...