@makaleks

OpenGL цветовые индексы или реализация glDrawPixels с праметром GL_BITMAP. Как?

Такое дело
Пишу простенький монохромный графический редактор, который сохранял бы мой чёрно-белый результат в текстовом файле в виде Bitmap'a, который я бы потом использовал при создании растровых шрифтов того же openGL. Просто интересно.
snimok.png
( скрин с glDrawPixels( 16, 16,GL_COLOR_INDEX, GL_BITMAP, map ) и glPixelZoom( 20, 20 ) )

Монохромному интерфейсу RGB как-то без надобности. Так вот, изменять (экранный) вывод было бы здорово, просто редактируя массив растрового Bitmap'a (напомню, что всё приведено к области типа 32x32 или 64x64 (разумеется, не в натуральную величину)), чтобы не рисовать 32x32 квадрата. Хотел использовать...
glBitmap( ... );
... с которым я более-менее знаком, но якобы его нельзя масштабировать (не делать же массив на все оконные пиксели)! Зато с помощью glPixelZoom ( ... ) можно масштабировать...
glDrawPixels( 16, 16,GL_COLOR_INDEX, GL_BITMAP, map );

Насколько я понимаю, ему нужен не RGB, а цветовые индексы.
Мало того, что индексные цвета задаются иначе ( glIndex(TYPE c) в котором я не понимаю, как передать цвет с помощью одного числа c...). А ведь, якобы, режим отображения цвета надо задавать ещё до инициализации окна...
По индексным цветам в инете информации мало (уж как мог искал). Литература же ограничивается рассуждениями об отличиях RGB от цветовых индексов и существованием функции glIndex( ... )

Так вот, вопросы:
1) Как реализовать glDrawPixels с параметром GL_BITMAP ?
1.1) Как работать с цветовыми индексами (желательно с примерами)?
  • Вопрос задан
  • 4417 просмотров
Решения вопроса 1
@makaleks Автор вопроса
Спасибо за ответы)
Если кому надо:

Задание цветового индекса является платформо-зависимой операцией.
У пользователей GLUT есть
glutSetColor(int cell,
GLfloat red, GLfloat green, GLfloat blue);

Другой способ лежит через GL_MAP_COLOR
Пример:
unsigned char bitmap[] = { 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00,
	0x00, 0xFF, 0xFF, 0x00,
	0x03, 0xFF, 0xFF, 0xC0,
	0x07, 0xFF, 0xFF, 0xE0,
	0x0F, 0x80, 0x01, 0xF0,
	0x1E, 0x00, 0x00, 0xF8,
	0x1C, 0x00, 0x00, 0x38,
	0x3C, 0x7E, 0x7E, 0x3C,
	0x38, 0x0E, 0x70, 0x1C,
	0x39, 0xF0, 0x0F, 0x9C,
	0x38, 0x00, 0x00, 0x1C,
	0x38, 0x00, 0x00, 0x1C,
	0x38, 0x38, 0x1C, 0x1C,
	0x38, 0xFE, 0x7F, 0x1C,
	0x38, 0xC6, 0x63, 0x1C,
	0x38, 0xD6, 0x6B, 0x1C,
	0x38, 0xD6, 0x6B, 0x1C,
	0x38, 0xC6, 0x63, 0x1C,
	0x38, 0xFE, 0x7F, 0x1C,
	0x38, 0x7C, 0x3E, 0x1C,
	0x3C, 0x00, 0x00, 0x3C,
	0x3C, 0x00, 0x00, 0x3C,
	0x7E, 0x00, 0x00, 0x7E,
	0x7F, 0x80, 0x01, 0xFE,
	0x77, 0xFF, 0xFF, 0xEE,
	0x63, 0xFF, 0xFF, 0xC7,
	0xE7, 0xFF, 0xFF, 0xE7,
	0xFF, 0xF0, 0x0F, 0xFF,
	0xFF, 0x00, 0x01, 0xFF,
	0xF0, 0x00, 0x00, 0x0F
};
void draw(){
	glClearColor(1, 1, 0, 1);//жёлтым
	glClear(GL_COLOR_BUFFER_BIT);//закрасить
	glPixelTransferi(GL_MAP_COLOR, 1);//использоваь карту
	float map[2] = { 1, 0 };//пусть...
		//...все единицы закрашивают в чёрный, а все нули - в белый цвета...
		glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, map);
		glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, map);
		glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, map);
	//...и все нули будут прозрачными
	map[0] = 0, map[1] = 1;
	glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, map);
	//Итого: для единиц действует цвет glColor4f(0,0,0,1), а для нулей будет glColor4f(1,1,1,0)

	glRasterPos2i(-160, -160);//позиция от центра экрана в пикселях ( не забыть вызвать glOrtho(...) )
	glPixelZoom(10, 10);//теперь работает

/*этот блок*/		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
/*лучше поставить*/	glEnable(GL_BLEND);					//прозрачность
/*в начале программы*/	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	//определяется компонентом ALPHA
	glDrawPixels(32, 32, GL_COLOR_INDEX, GL_BITMAP, bitmap);//рисовать 32x32 bitmap, где кадый бит определяет цветовой индекс "0" или "1"

	glPixelTransferi(GL_MAP_COLOR, 0);//не использовать карту
}

2b74cc08dc274662aebbbd40563885b8.PNG
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы