2017-01-21 2 views
0

У меня есть карта высот из 16 бит целых чисел со знаком. Если я пробовал текстуру с использованием нормализованного поплавка, он будет отображен в порядке. Таким образом, для нормированных поплавками я загрузить текстуру как:Цепочки выборки в шейдере OpenGL не работают. Результат всегда 0

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, 512, 512, 0, GL_RED, GL_SHORT, data); 

Тогда в затенении я делаю:

layout (binding = 0) uniform sampler2D heightmap; 

float height = texture(heightmap, inTexCoords).r; 

Тогда высота является -32768 до +32767 нормированы на -1,0 и 1,0. Это прекрасно работает. Но я хочу, чтобы прочитать значение как целое, так что я:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, 512, 512, 0, GL_RED, GL_SHORT, data); 

И в шейдере:

layout (binding = 0) uniform isampler2D heightmap; // < -- Notice I put isampler here 

float height = texture(heightmap, inTexCoords).r;  // < -- This should return an ivec4, the r value should have my 16 bit signed value, right? 

Но независимо от того, что я делаю это ВСЕГДА образцы 0. Я не знаю, что делать, я попытался отключить фильтрацию текстур и смешение (как я слышал, они могут не работать) и все равно ничего.

Правильны ли другие аргументы для glTexImage2D? GL_RED и GL_SHORT?

спасибо.

ответ

1

Другие аргументы в адрес glTexImage2D исправить? GL_RED и GL_SHORT?

No. Для GL_R16I внутреннего формата, вы должны использовать GL_RED_INTEGER в качестве формата данных на стороне клиента.

+0

Спасатель, спасибо. – Zebrafish