Значение OpenGL usampler2d не может быть разделено - PullRequest
2 голосов
/ 06 апреля 2020

Я писал шейдеры 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.

1 Ответ

3 голосов
/ 06 апреля 2020

Для использования usampler2D внутренний формат должен быть целым без знака (например, GL_R8UI). См. Типы сэмплера .
Если внутренним форматом является базовый c формат GL_RED, то тип сэмплера должен быть sampler2D.
Примечание. sampler* для использование форматов с плавающей запятой, isampler* для целых форматов со знаком и usampler* для целых форматов без знака.
См. Язык затенения OpenGL 4.60 Спецификация - 4.1.7. Непрозрачные типы и Язык затенения OpenGL 4.60 Спецификация - 8.9. Функции текстуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...