Почему отсутствует компонент зеленого цвета с использованием функции glTexImage2D?

0

Я пишу свой 3D-движок без OpenGL или DirectX. Каждый 3D-расчет - это мой собственный код. Когда вычисляется весь кадр (массив 2D-цветов), я должен нарисовать его в окне, и для этого я использую GLUT и OpenGL. Но я не использую функции OpenGL 3D.

Поэтому у меня есть 2D-массив цветов (на самом деле 1D массив без знака, который используется как 2D-массив), и я должен сделать его с OpenGL/GLUT эффективным способом.

Есть две важные вещи:

  • производительность (значение FPS)
  • легко изменять размер, автоматически масштабировать содержимое окна

Я написал 3 возможных решения:

  • 2 для цикла, каждый пиксель представляет собой GL_QUADS с цветом. Очень медленно, но работает хорошо, и размер окна также работает хорошо.
  • glDrawPixels, не самый эффективный, но я доволен значением FPS. К сожалению, когда я изменяю размер окна, содержимое не масштабируется автоматически. Я попытался написать свою собственную функцию обратного вызова для изменения размера, но она никогда не срабатывала. Зеленый цвет отсутствует, это нормально.
  • Лучшим решением, вероятно, является создание текстуры из этого массива без знака и рисование только одного GL_QUADS. Очень быстро, и изменение размера окна работает хорошо, масштабирование содержимого автоматически. Но, и это мой вопрос, отсутствует компонент зеленого цвета, я не знаю, почему.

Несколько часов назад я использовал массив float, 3 компонента и значения 0... 1. Зеленый отсутствовал, поэтому я решил использовать массив unsigned char, потому что он меньше. Теперь я использую 4 компонента, но четвертый всегда не используется. Значения: 0... 255. Зеленый цвет все еще отсутствует. Мой код текстурирования:

GLuint TexID;
glGenTextures(1, &TexID);
glPixelStorei(GL_UNPACK_ALIGNMENT, TexID); // I tried PACK/UNPACK and ALIGNMENT/ROW_LENGTH, green is still missing
glTexImage2D(GL_TEXTURE_2D, 0, RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, a->output);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glBindTexture(GL_TEXTURE_2D, TexID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
    // glTexCoord2f ... glVertex2f ... four times
glEnd();
glDisable(GL_TEXTURE_2D);
glDeleteTextures(1, &TexID);

Если я использую glDrawPixels, он работает хорошо, компоненты R, G и B находятся в окне. Но когда я использую код выше с glTexImage2D, зеленый компонент отсутствует. Я пробовал много вещей, но ничто не решило этот зеленый вопрос.

Я рисую цветные кубы с моим 3D-движком и который содержит зеленый компонент (например, оранжевый, белый или зеленый), он имеет другой цвет, без зеленого компонента. Оранжевый - красный, зеленый - черный и т.д. 3D-объекты, которые не содержат зеленый компонент, хороши, например, красные кубы красные, синие кубы синие.

Я думаю, что параметры glTexImage2D ошибочны, и я должен их изменить.

  • 0
    Как именно вы вызываете glDrawPixels() ?
  • 0
    Помогает ли сброс glColor3f(1,1,1) перед вашим glBegin() ?
Показать ещё 1 комментарий
Теги:
opengl
glut

1 ответ

1

glPixelStorei(GL_UNPACK_ALIGNMENT, TexID); это очень неправильно.

Принятые значения для этой функции:

  • 1, 2, 4 и 8

И они представляют выравнивание строк (в байтах) для данных изображения, которые вы загружаете. Для 8-битного изображения RGBA для каждого компонента обычно требуется 1 или 4 (по умолчанию).

Вам здесь очень повезло, если это действительно работает. Miraculously TexID должен быть 1 (возможно, потому, что у вас только 1 текстура загружена). Как только у вас будет загружено 3 текстуры, и вы получите значение для TexID из 3, вы собираетесь генерировать GL_INVALID_VALUE и ваша программа вообще не собирается работать.

  • 0
    Спасибо, я исправил это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню