Я пишу свой 3D-движок без OpenGL или DirectX. Каждый 3D-расчет - это мой собственный код. Когда вычисляется весь кадр (массив 2D-цветов), я должен нарисовать его в окне, и для этого я использую GLUT и OpenGL. Но я не использую функции OpenGL 3D.
Поэтому у меня есть 2D-массив цветов (на самом деле 1D массив без знака, который используется как 2D-массив), и я должен сделать его с OpenGL/GLUT эффективным способом.
Есть две важные вещи:
Я написал 3 возможных решения:
Несколько часов назад я использовал массив 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 ошибочны, и я должен их изменить.
glPixelStorei(GL_UNPACK_ALIGNMENT, TexID);
это очень неправильно.
И они представляют выравнивание строк (в байтах) для данных изображения, которые вы загружаете. Для 8-битного изображения RGBA для каждого компонента обычно требуется 1 или 4 (по умолчанию).
Вам здесь очень повезло, если это действительно работает. Miraculously TexID
должен быть 1 (возможно, потому, что у вас только 1 текстура загружена). Как только у вас будет загружено 3 текстуры, и вы получите значение для TexID
из 3, вы собираетесь генерировать GL_INVALID_VALUE
и ваша программа вообще не собирается работать.
glDrawPixels()
?glColor3f(1,1,1)
перед вашимglBegin()
?