2016-08-17 26 views
1

正如Apple的文檔中所述,着色語言的texture2d可以是int類型。我曾嘗試使用int類型的texture2d作爲着色器語言的參數,但是texture2d的寫入方法失敗。text2d <int,access:write>的寫入方法在金屬着色器功能中不起作用

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

           uint2 gid [[ thread_position_in_grid ]]) 
{  

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

} 

但是,如果我用float替換int,它就起作用了。

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,短的Texture2D等,被用作着色器的功能參數,以及如何使用它們?感謝您審查我的問題。

的相關主機代碼:

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

的代碼來顯示由GPU計算出的輸出,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") 
} 

回答

0

Metal Shading Language Guide指出:

注:如果T是int或短,與紋理相關的數據必須使用符號的整數格式。如果T是uint或ushort,則與紋理關聯的數據必須使用無符號整數格式。

您所要做的就是確保您在API(主機代碼)中寫入的紋理與內核函數中的紋理相匹配。或者,在寫入outTexture之前,您還可以將int值寫入float

+0

@ Marius。感謝您的答覆。 API(主機代碼)匹配是什麼意思?相關的主機代碼也在上面列出。請您指出是否有任何問題? – Pony

+0

setTexture之前確保您的紋理數據也是int。如果你不能以這種方式工作,你也可以在寫入outTexture之前將這些整數轉換爲浮點數。 – Marius