Estou amostrando uma imagem R16_UINT no shader com um usampler2D. Eu faço:
uvec4 upix_color = texture(usampler2D(utextures[nonuniformEXT(idx_of_height_map)], samplers[0]), result.uvs);
Mas parece que os valores não retornam filtrados/interpolados, como mostra esta imagem:
Sei que uma imagem em tons de cinza R16 também pode ser R16_UNORM, caso em que é lida como um ponto flutuante normalizado, e sei que números inteiros podem ser mais difíceis de interpolar, mas números inteiros no intervalo de 0 a 65.535 devem poder ser interpolados.
OpenGL
No OpenGL, a interpolação (filtragem linear) não é suportada para texturas inteiras. Na verdade, tentar configurar isso resultaria em uma textura incompleta . Da especificação OpenGL 4.5 , Seção 8.17:
(Texto reordenado para maior clareza.)
Em outras palavras, para texturas inteiras, os parâmetros de filtragem devem ser definidos para filtragem de vizinho mais próximo .
Isso também é expresso no site da Khronos em termos menos técnicos:
Vulcano
No Vulkan, uma implementação pode suportar interpolação (filtragem linear) para texturas inteiras, mas não é necessário . Da especificação Vulkan 1.4.310 , Seção 48.3:
Na tabela a seguir, mostra que
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
(ou seja, suporte para filtragem linear) não é suportado para formatos de imagem inteiros, incluindoVK_FORMAT_R16_UINT
. Em teoria, você poderia usarGetPhysicalDeviceFormatProperties
para consultar se a interpolação está disponível na implementação. No entanto, eu esperaria que isso (quase) nunca fosse o caso, já que a interpolação de ponto flutuante para texturas é tipicamente implementada em hardware, mas a interpolação inteira não é.