Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.227.209.89] |
|
Сообщ.
#1
,
|
|
|
Как использовать две текстуры для достижения прозрачности (полупрозрачности).
В старых играх часто в папках лежали два файла картинка и черно-белая маска. Как использовать такую технику рисования, где вторая картинка по сути альфа-канал? Есть рисунок 1 Прикреплённая картинка
Есть рисунок 2 (маска) Прикреплённая картинка
glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_COLOR, GL_ZERO); glBindTexture(GL_TEXTURE_2D, e::texture[1]); FormPaintTextures(0, 0); glBlendFunc(GL_ONE, GL_DST_COLOR); glBindTexture(GL_TEXTURE_2D, e::texture[0]); FormPaintTextures(0, 0); Получился результат Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
Не знаю, как это делается в OpenGL (всегда использовал Direct3D).
Для Direct3D, если нужно, могу написать соответствующий шейдер. Только это в любом случае не оптимально, лучше на этапе загрузки сразу поместить данные первого изображения в RGB, а второго в A каналы одной текстуры. |
Сообщ.
#4
,
|
|
|
Цитата лучше на этапе загрузки сразу поместить данные первого изображения в RGB, а второго в A каналы одной текстуры Да, кстати, это отличная идея!, а как это делается ? Есть ли у Вас примерчик как это делается в Direct3D ? Под OpenGL я перепишу. PS Пишу игрушку платформер-головоломку ) |
Сообщ.
#5
,
|
|
|
Цитата F0X @ Есть ли у Вас примерчик как это делается в Direct3D ? Сделал небольшой примерчик на FFP: https://disk.yandex.ru/d/V7C-p_RMgNdi3A |
Сообщ.
#6
,
|
|
|
Спасибо, буду разбираться )
|
Сообщ.
#7
,
|
|
|
void FormLoadTexturesGL() { int i, j; FILE *file1; FILE *file2; BOOL flag; file1 = NULL; file2 = NULL; flag = FALSE; char str[][256] = { "Pic 001.bmp", "Pic 002.bmp" }; glGenTextures(1, &e::texture[0]); file1 = fopen(str[0], "r"); file2 = fopen(str[1], "r"); if ((file1) && (file2)) { flag = TRUE; fread(e::data1, 54, 1, file1); fread(e::data1, 512 * 512 * 3, 1, file1); fread(e::data2, 54, 1, file2); fread(e::data2, 512 * 512 * 3, 1, file2); for (j=0; j<512; j++) { for (i=0; i<512; i++) { e::data3[i][j][0] = e::data1[i][j][0]; e::data3[i][j][1] = e::data1[i][j][1]; e::data3[i][j][2] = e::data1[i][j][2]; e::data3[i][j][3] = e::data2[i][j][1]; } } glBindTexture(GL_TEXTURE_2D, e::texture[0]); glTexImage2D(GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, e::data3); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); fclose(file1); fclose(file2); } if (!flag) { MessageBox(NULL, "Error : Textures load impossible", e::appname, MB_OK | MB_ICONERROR); exit(0); } } Все работает |
Сообщ.
#8
,
|
|
|
Цитата F0X @ Все работает Поздравляю! |