Текстура в градациях серого OpenGL как плавающий формат - PullRequest
0 голосов
/ 27 сентября 2018

Я получил массив со значениями с плавающей запятой в диапазоне 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);

[Редактировать] Вывод изображения: enter image description here Есть идеи, что не так?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы должны установить параметры текстуры, чтобы обработать 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;
}
0 голосов
/ 27 сентября 2018

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

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

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

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

...