Как отправить ненормализованные / незакрепленные значения в шейдер GLSL с использованием текстур opengl? - PullRequest
3 голосов
/ 21 мая 2019

Я пытаюсь отправить массив значений с плавающей точкой (карту высот) в GLSL как GL_TEXTURE_2D.Хотя сэмплеры настроены правильно, проблема заключается в ограничении, которое происходит, когда я загружаю текстуру с помощью glTexImage2D ().

  glGenTextures(1, &_idnewTID);
  glBindTexture(GL_TEXTURE_2D, _idnewTID);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, regMesh._cols, regMesh._rows, 0, GL_RED, GL_FLOAT, regMesh._heightMap);

Отправляемые значения находятся в диапазоне от 900.0f до 1590.0f.,Но это становится полностью ограниченным до 1.0f при загрузке в GL_TEXTURE_2D.

Как сохранить значения от фиксации до [0,1].Как мне изменить функцию glTexImage2D (), чтобы добиться этого?

PS Я знаю, что сэмплер работает нормально, потому что когда я делю значения на 1500.0f и загружаю их в GPU и масштабирую в шейдере, я получаюправильная структура карты высот.

1 Ответ

5 голосов
/ 22 мая 2019

Во-первых, вы всегда должны использовать внутренний формат размера (это третий параметр glTexImage*).GL_RED оставляет слишком много для реализации.

Во-вторых, вы пытаетесь хранить и использовать данные с плавающей запятой.Поэтому вам нужно выбрать внутренний формат с плавающей запятой, а не нормализованный целочисленный.Если размер внутреннего формата не заканчивается на F, то он не хранит значения с плавающей точкой.GL_R32F будет уместно.

...