метод записи texture2d ‹int, доступ: запись› не работает в функции шейдера металла

Как упоминалось в документе Apple, texture2d языка затенения может иметь тип int. Я попытался использовать texture2d типа int в качестве параметра языка шейдеров, но метод записи texture2d не сработал.

kernel void dummy(texture2d<int, access::write> outTexture [[ texture(0) ]],

                               uint2 gid [[ thread_position_in_grid ]])
{       

     outTexture.write( int4( 2, 4, 6, 8 ), gid );

}

Однако, если я заменю int на float, это сработает.

kernel void dummy(texture2d<float, access::write> outTexture [[ texture(0) ]],

                               uint2 gid [[ thread_position_in_grid ]])
{       

     outTexture.write( float4( 1.0, 0, 0, 1.0 ), gid );

}

Могут ли другие типы texture2d, такие как texture2d для int, texture2d для short и т. Д., Использоваться в качестве параметров функции шейдера, и как их использовать? Спасибо за просмотр моего вопроса.

Соответствующие коды хоста:

 MTLTextureDescriptor *desc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm 
 desc.usage = MTLTextureUsageShaderWrite;
 id<MTLTexture> texture = [device newTextureWithDescriptor:desc];
 [commandEncoder setTexture:texture    atIndex:0];

В коде, показывающем результат, вычисленный графическим процессором, w и h представляют ширину и высоту textrue соответственно.

uint8_t* imageBytes = malloc(w*h*4);
memset( imageBytes, 0, w*h*4 );
MTLRegion region = MTLRegionMake2D(0, 0, [texture width], [texture height]);
[texture getBytes:imageBytes bytesPerRow:[texture width]*4 fromRegion:region mipmapLevel:0];

for( int j = 0; j < h; j++ )
{
  printf("%3d: ", j);
  for( int i = 0; i < w*pixel_size; i++ )
  {
       printf(" %3d",imageBytes[j*w*pixel_size+i] );
  }
   printf("\n")
 }

person Pony    schedule 17.08.2016    source источник


Ответы (1)


Руководство по языку Metal Shading утверждает, что:

Примечание. Если T имеет тип int или short, данные, связанные с текстурой, должны использовать целочисленный формат со знаком. Если T - uint или ushort, данные, связанные с текстурой, должны использовать беззнаковый целочисленный формат.

Все, что вам нужно сделать, это убедиться, что текстура, которую вы пишете в API (код хоста), соответствует той, что у вас есть в функции ядра. В качестве альтернативы вы также можете преобразовать значения int в float перед записью в outTexture.

person gpu3d    schedule 17.08.2016
comment
@ Мариус. Спасибо за ваш ответ. Что означает совпадение API (кода хоста)? Соответствующие коды хоста также были перечислены выше. Не могли бы вы указать, были ли какие-то проблемы? - person Pony; 18.08.2016
comment
перед установкой текстуры убедитесь, что ваши данные текстуры также имеют тип int. если вы не можете заставить его работать таким образом, вы также можете преобразовать целые числа в числа с плавающей запятой перед записью в outTexture. - person gpu3d; 18.08.2016