Я получил массив со значениями с плавающей точкой в диапазоне 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);
[Изменить] Вывод изображения:Вы должны установить параметры текстуры, чтобы обработать OpenGL для считывания канала зеленого и синего цветов из канала красного цвета, когда текстура ищется — смотрите glTexParameteri
:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED );
Они получены путем вычисления
базовый цвет 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;
}
В седьмом аргументе функции glTexImage2D вы должны установить формат изображения. Вы установили его на GL_RED. Вы должны установить его в формат вашей картинки, скорее всего, GL_RGB или GL_RGBA.
Пожалуйста, прочитайте документация.
Если это не работает с правильным форматом текстуры, что-то еще не так. Хотя невозможно сказать не видя остальную часть вашего кода.
Вы уверены, что ваши данные загружены правильно?
Вы отправляете правильные координаты текстуры фрагментному шейдеру?
Вы помните, чтобы установить активный texure?
Вы установили Sampler2D в своем фрагментном шейдере на то же значение, что и активный шейдер?