Я писал шейдеры GLSL и использовал целочисленную текстуру (GL_RED) для хранения значений в шейдере. Когда я пытаюсь разделить значение, взятое из текстуры usampler2D, оно остается прежним. Ниже приведен минимальный воспроизводимый шейдер.
#version 440
in vec2 uv;
out vec3 color;
layout (binding = 1) uniform usampler2D tm_data;
void main(){
float index = texture(tm_data, uv).r;
float divisor = 16.0f
color = vec3(index / divisor, 0, 0);
}
Отображаемое значение красного всегда равно 1,0 независимо от способа, которым я пытаюсь разделить или изменить значение индекса.
Когда сэмплер изменяется на нормализованный (sampler2D), манипулирование цветом работает как ожидалось
#version 440
in vec2 uv;
out vec3 color;
layout (binding = 1) uniform sampler2D tm_data; //Loads as normalized from [0,255] to [0,1]
void main(){
float index = texture(tm_data, uv).r * 255.0f; //Convert back to integer approximation
float divisor = 4.0f
color = vec3(index / divisor, 0, 0); //Shade of red now appears considerably darker
}
Кто-нибудь знает, почему происходит это неожиданное поведение?
Текстура tm_data загружается как GL_RED -> GL_RED Используемая версия OpenGL 4.4 Это не используется фреймворк (никаких хитрых дополнений), все загружается с использованием вызовов функций gl.