Текстура в градациях серого OpenGL в формате с плавающей точкой

Я получил массив со значениями с плавающей точкой в ​​диапазоне 0,0 — 1,0 (карта высот), но текстура возвращается либо в черный, либо в красный цвет. Я пробовал несколько комбинаций внутреннего и исходного форматов, но, похоже, ничего не работает. Мой текущий код, который просто дает мне красную текстуру:

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, w, h, 0, GL_RED, GL_FLOAT, data);
[Изменить] Вывод изображения:
введите описание изображения здесь
Есть идеи, что не так?

1

Решение

Вы должны установить параметры текстуры, чтобы обработать OpenGL для считывания канала зеленого и синего цветов из канала красного цвета, когда текстура ищется — смотрите glTexParameteri:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED );

Увидеть Спецификация профиля совместимости API OpenGL 4.6; 16.1 Текстурные среды и текстурные функции; страница 595:

Они получены путем вычисления
базовый цвет Cb и Ab из отфильтрованных значений текстуры Rt, Gt, Bt, At, Lt и It, как показано в таблице 16.1, …

Texture Base Texture base color Internal Format    Cb              Ab
...
RED                                                (Rt, 0, 0)      1
RG                                                 (Rt, Gt, 0)     1
RGB                                                (Rt, Gt, Bt)    1
RGBA                                               (Rt, Gt, Bt)    At

Таблица 16.1. Соответствие отфильтрованных компонентов текстуры компонентам основы текстуры.

…с последующим переворотом компонентов Cb, контролируемых значениями параметров текстуры TEXTURE_SWIZZLE_R, TEXTURE_SWIZZLE_G, TEXTURE_SWIZZLE_B, а также TEXTURE_SWIZZLE_A, Если значение TEXTURE_SWIZZLE_R обозначается swizzler, swizzling вычисляет первый компонент Cs в соответствии с

if (swizzler == RED)
Cs[0] = Cb[0];
else if (swizzler == GREEN)
Cs[0] = Cb[1];
else if (swizzler == BLUE)
Cs[0] = Cb[2];
else if (swizzler == ALPHA)
Cs[0] = Ab;
else if (swizzler == ZERO)
Cs[0] = 0;
else if (swizzler == ONE)
Cs[0] = 1; // float or int depending on texture component type

Если бы вы использовали шейдерную программу, было бы возможно сделать нечто подобное в фрагментном шейдере, Swizzling:

in vec3 uv;

out vec4 frag_color;

uniform sampler2D u_texture;

void main()
{
frag_color = texture(u_texture, uv).rrra;
}
2

Другие решения

В седьмом аргументе функции glTexImage2D вы должны установить формат изображения. Вы установили его на GL_RED. Вы должны установить его в формат вашей картинки, скорее всего, GL_RGB или GL_RGBA.

Пожалуйста, прочитайте документация.

Если это не работает с правильным форматом текстуры, что-то еще не так. Хотя невозможно сказать не видя остальную часть вашего кода.

Вы уверены, что ваши данные загружены правильно?
Вы отправляете правильные координаты текстуры фрагментному шейдеру?
Вы помните, чтобы установить активный texure?
Вы установили Sampler2D в своем фрагментном шейдере на то же значение, что и активный шейдер?

0

По вопросам рекламы [email protected]