OpenGL: отключить цвета текстур?

Можно ли отключить цвета текстур и использовать только белый цвет? Он по-прежнему будет читать текстуру, поэтому я не могу использовать glDisable (GL_TEXTURE_2D), потому что я тоже хочу отображать альфа-каналы.

Теперь я могу подумать о том, чтобы создать новую текстуру, где все цветовые данные будут белыми, оставаясь альфами, как есть.

Мне нужно сделать это без шейдеров, так возможно ли это?

Изменить:, чтобы уточнить: я хочу использовать обе текстуры: белый и обычный цвета.

Изменить: это НЕ ВОЗМОЖНО

2 ответа

Как насчет изменения цвета текстуры (кроме альфа) до белого после их загрузки и до того, как они будут использованы в OpenGL? Если в какой-то момент у вас есть растровые изображения в памяти, это должно быть легко, и вам не понадобятся отдельные файлы текстур.


Я все еще не совсем уверен, что правильно понимаю, что вы хотите, но я дам ему шанс. Я имел в виду, что когда вы вызываете glTexImage2D, вы указываете формат загружаемых текселей и указываете "внутренний формат" текстуры, которую вы создаете из этих текселей. В типичном случае вы указываете (примерно) тот же формат для обоих - например. вы обычно используете GL_RGBA для обоих.

Существует причина для указания обоих: format (параметр, близкий к концу списка) определяет формат загружаемых текселей, но internal format (тот, который близок к начало списка параметров) определяет формат фактической текстуры, создаваемой вами из тех текселей.

Если вы хотите загрузить некоторые тексели, но на самом деле используете только альфа-канал, вы можете указать GL_ALPHA для internal format, и все, что вы получите, - когда вы нарисуете эту текстуру на поверхность, это повлияет только на альфа, а не на цвет. Это не только позволяет сделать дополнительную копию ваших текселей, но (как минимум, обычно) уменьшает объем памяти, потребляемый самой текстурой, поскольку он включает только альфа-канал, а не три цветовых канала.

Изменить: Хорошо, подумав об этом немного, есть способ сделать то, что (я думаю), вы хотите, используя только одну текстуру. Во-первых, вы устанавливаете функцию blend только для использования альфа-канала, а затем, когда вы хотите скопировать цвет текстуры, вы вызываете glTextureEnvf с помощью GL_REPLACE, но когда вы хотите использовать только альфа-канал, вы вызываете его с GL_BLEND. Например, дайте создать зеленую текстуру и нарисуйте ее (дважды) над синим квадратом, один раз с GL_REPLACE и с GL_BLEND. Для простоты мы будем использовать сплошную текстуру gree, причем альфа увеличивается линейно сверху (0) до нижней (1):

static GLubyte Image[128][128][4];
for (int i=0; i<128; i++)
 for (int j=0; j<128; j++) {
 Image[i][j][0] = 0;
 Image[i][j][1] = 255;
 Image[i][j][2] = 0;
 Image[i][j][3] = i;
 }

Я пропущу большую часть создания и привязки текстуры, установки параметров и т.д. и получаю непосредственно рисование пары квадов с текстурой:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, 0.0f);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(1.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(1.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
 glColor4f(0.0, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glBegin(GL_QUADS);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(0.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, -1.0f, 0.0f);
 glColor4f(0.0, 0.0f, 1.0f, 1.0f);
 glTexCoord2f(0.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glEnd();

Это дает:

Итак, слева, где он нарисован с помощью GL_REPLACE, мы получаем зеленый цвет текстуры, но справа, где он нарисован с помощью GL_BLEND (и glBlendFunc был настроен на использование только альфа-канала), мы получаем синий квадрат, но с его альфой, взятой из текстуры, но мы используем точно такую ​​же текстуру для обоих.

Редактирование 2: Если вы решите, что вам действительно нужна текстура, все белые, я бы просто создал 1-пиксельную текстуру и установил GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T в GL_REPEAT. Несмотря на то, что это все еще использует дополнительную текстуру, эта дополнительная текстура будет очень крошечной, так как это только один пиксель. И время загрузки, и потребляемая память будут поистине незначительными - данные для пикселя в основном "шумы". Я не пытался тестировать, но вам может быть лучше с чем-то вроде блока пикселей размером 8x8 или 16x16. Это все еще так мало, что это не имеет большого значения, но это размеры, используемые в JPEG и MPEG соответственно, и я могу видеть, где может быть оптимизирована карта и (особенно) драйвер для них. Это может помочь и не повредит (достаточно заботиться о любом случае).

licensed under cc by-sa 3.0 with attribution.