24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
1

Альфа канал

28.11.2012, 08:33. Показов 4301. Ответов 23
Метки нет (Все метки)

Доброго времени суток, подскажите как настроить текстуру и OPG на альфа канал, то есть я выбираю какой либо цвет например Color(0.0,1.0,0.0) и весь зелёный в текстуре становиться прозрачным, относительно других текстур и объектов. Или как альтернатива что пиксели с выбранным цветом утоляются или не рисуются. очень надо, самый живой пример это отображение спрайтового дерева оно же не рисуется не квадратиком с контуром, а аккуратненькой текстурой) =) подскажите плизма как это реализовать. =)

Добавлено через 13 часов 16 минут
Ну что никто вообще ничего не знает? =((( И в учебниках ничего, ка это вообще реализуется?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2012, 08:33
Ответы с готовыми решениями:

С++ openGL Альфа канал
Практикуюсь пишу игру. Использую с++ и openGl. Помогите загрузить текстуру с альфа каналом. Рабочий...

Альфа смешивание
Доброго времени суток! Реализую прозрачные панели, но столкнулся с тем, что смешивание...

Ошибка в альфа канале
#include <windows.h> #include <stdio.h> #include <stdarg.h> #include <gl\gl.h> #include...

Текстура с альфа каналом
Всем доброго времени суток. Возникла проблема с наложением текстуры с альфа-каналом на примитив....

23
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
28.11.2012, 21:33 2
Что такое OPG ?
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
29.11.2012, 03:38  [ТС] 3
Цитата Сообщение от lazybiz Посмотреть сообщение
Что такое OPG ?
Это сокращение OpenGL (OGL) вроде видел по документации так обзывался)) =)
0
2505 / 1312 / 219
Регистрация: 26.02.2009
Сообщений: 5,950
Записей в блоге: 5
29.11.2012, 13:44 4
MaRKerNSK, проще всего нарисовать/изменить нужную текстуру в нормальном графическом редакторе, например, в Photoshop'е, который проддерживает альфа канал. Потом загрузить её:
C++
1
2
glTexImage2D(GL_TEXTURE_2D, 0, 4, texture->sizeX, texture->sizeY, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, texture->data);
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
29.11.2012, 16:10  [ТС] 5
Ну я тоже так думал, но во первых как то топорно)) во вторых я юзаю функцию
C++
1
AUX_RGBImageRec *texture1 = auxDIBImageLoadA("0.bmp");
которая не позволяет загружать .jpg или любой другой канал с альфа каналом, просто я знаю что во многих играх реализуется фокус с розовым фоном что весь розовый цвет заменяется а от и удаляется совсем, и тем самым это улучшает модель, и позволяет делать выбор по модели а не по координатном) но за совет и то спс) =)
0
2505 / 1312 / 219
Регистрация: 26.02.2009
Сообщений: 5,950
Записей в блоге: 5
29.11.2012, 18:36 6
Цитата Сообщение от MaRKerNSK Посмотреть сообщение
я юзаю функцию
Как будто в мире нет больше других ф-ий
Открою страшную тайну: bmp бывает не только 24-битный. Он может содержать альфа канал по мимо RGB. И завётся он 32bit-ным. А ещё бывает 16, 8, палитровый и даже 1-битный. Так что возможно ваша ф-ия умеет работать с бмп32.

Ну если не хотите юзать редактор. То вам уже описали в соседней ветке как можно самостоятельно работать с массивом пикселей.
1
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
30.11.2012, 09:45  [ТС] 7
Блни точно 32бит ный БПМ ай фак мой мозг, 4 дня подарят изучение графики вредит мозгу)) ладно и за это спасибо))) =)
0
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
13.12.2012, 03:43 8
Как определяется какой цвет в текстуре будет прозрачным?
0
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
13.12.2012, 17:11 9
Как определяется какой цвет в текстуре будет прозрачным?
Каждый пиксель в растре, очевидно в этом случае имеет дополнительный Alpha -канал, кроме Red, Green, Blue
RGBA -формат - 32бита на точку. Alpha - 8 бит, значения от 0 до 255 это все варианты степени прозрачности пикселя.
0
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 08:06 10
Возможно ли в Paint создать RGBA BMP? как в BMP задать альфа-канал (без использования сторонних не бесплатных программ)? Возможно ли при загрузке текстуры в DirectX задать всем цветам альфа-канал?
0
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
14.12.2012, 10:29 11
Возможно ли при загрузке текстуры задать всем цветам альфа-канал?
Ну а почему бы и нет, создаешь динамической кусок памяти и туда перебираешь все пиксели из растра + дополняешь альфой каждый пиксель.
Для себя написал не хитрую программу tga+a, которая все это обрабатывает пачками(через *.bat - файл) и я гружу уже готовые ресурсы с альфой, ну а если надо жму их еще в dds с помощью bat - (nvdxt.exe -all -dxt1 -flip)
альфа канал рисую отдельно ( монохромный рисунок ) либо считаю что первый пиксель в изображении будет считаться прозрачным во всей текстуре.

Однако, если такой спартанский подход пугает можно еще в gimp'e все это дело рисовать и экспортить с помощью плагинов в dds с альфой.
1
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 11:32 12
Вот написал прогармму как задать альфа-канал
не понимаю однако как сделать чтобы DirectX использовал альфа-канал для того, чтобы белый цвет спрайта накладываемого поверх был полностью прозрачным?
В соответствии с одной из статей по мультитекстурированию вот так я накладываю спрайты друг на друга:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
    d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
    d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
 
     d3ddev->SetTexture(1, lptex17);
    d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
    d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
    d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_MODULATE );
    d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Добавить альфа канал в BMP
// Описание формата BMP: [url]http://ru.wikipedia.org/wiki/BMP[/url]
 
 
#include <stdio.h>
#include <windows.h>
 
 struct pixel_rgba
 {
  public:
   BYTE b;
   BYTE g;
   BYTE r;
   BYTE a;
 };
 
 struct pixel_rgb
 {
  public:
   BYTE b;
   BYTE g;
   BYTE r;
 };
 
 
int main()
{
BITMAPFILEHEADER bmp_header;
BITMAPINFOHEADER info_header;
int i;
unsigned char y;
 
FILE *f;
FILE *g;
f = fopen("wood_100x100.bmp", "rb");
g = fopen("wood_100x100rgba.bmp", "wb");
fseek(f, 0 , SEEK_SET);
// SEEK_SET на начало файла
// SEEK_CUR текущая позиция
fread(&bmp_header, 1, sizeof(BITMAPFILEHEADER), f);
printf("sizeof(BITMAPFILEHEADER) : %x %d\n",
sizeof(BITMAPFILEHEADER), sizeof(BITMAPFILEHEADER));
fseek(g, 0 , SEEK_SET);
fwrite(&bmp_header, 1, sizeof(BITMAPFILEHEADER), g);
 
 
 
 
int dr = bmp_header.bfOffBits - sizeof(BITMAPFILEHEADER);
printf("dr: %d\n", dr);
 
if (dr == 40)
{
fseek(g, sizeof(BITMAPFILEHEADER), SEEK_SET);
fread(&info_header, 1, sizeof(BITMAPINFOHEADER), f);
 
  info_header.biSize = sizeof(BITMAPINFOHEADER);
  printf("info_header.biSize: %x\n", info_header.biSize);
  printf("info_header.biWidth: %d\n", info_header.biWidth);
  printf("info_header.biHeight: %d\n", info_header.biHeight);
  printf("info_header.biPlanes: %d\n", info_header.biPlanes);
  printf("info_header.biBitCount: %d\n", info_header.biBitCount);
  printf("info_header.biCompression: %d\n", info_header.biCompression);
  printf("info_header.biSizeImage: %d\n", info_header.biSizeImage);
  printf("info_header.biXPelsPerMeter: %d\n", info_header.biXPelsPerMeter);
  printf("info_header.biYPelsPerMeter: %d\n", info_header.biYPelsPerMeter);
  printf("info_header.biClrUsed: %d\n", info_header.biClrUsed);
  printf("info_header.biClrImportant: %d\n", info_header.biClrImportant);
 
info_header.biBitCount = 32;
 
fseek(g, sizeof(BITMAPFILEHEADER) , SEEK_SET);
fwrite(&info_header, 1, sizeof(BITMAPINFOHEADER), g);
 
}
 
printf("bmp_header.bfType: %x\n", bmp_header.bfType);
printf("bmp_header.bfSize: %x\n", bmp_header.bfSize);
printf("bmp_header.bfReserved1: %x\n", bmp_header.bfReserved1);
printf("bmp_header.bfReserved2: %x\n", bmp_header.bfReserved2);
printf("bmp_header.bfOffBits: %x\n", bmp_header.bfOffBits);
 
printf("sizeof(BITMAPFILEHEADER) : %x %d\n", sizeof(BITMAPFILEHEADER), sizeof(BITMAPFILEHEADER));
printf("sizeof(BITMAPV4HEADER) : %x %d\n", sizeof(BITMAPV4HEADER), sizeof(BITMAPV4HEADER));
printf("sizeof(BITMAPV5HEADER) : %x %d\n", sizeof(BITMAPV5HEADER), sizeof(BITMAPV5HEADER));
 
 
// перебор пикселей изображения
int offset;
int offset2;
int j = 0;
int h = sizeof(pixel_rgb);
printf("sizeof(pixel_rgb) : %x %d\n", sizeof(pixel_rgb), sizeof(pixel_rgb));
pixel_rgb rt;
pixel_rgba rt2;
// условие остановки
while(bmp_header.bfOffBits +  j * sizeof(pixel_rgb) < bmp_header.bfSize)
{
offset =  bmp_header.bfOffBits +  j * sizeof(pixel_rgb);
offset2 =  bmp_header.bfOffBits +  j * sizeof(pixel_rgba);
fseek(f, offset , SEEK_SET);
fread(&rt, 1, sizeof(pixel_rgb), f);
rt2.b = rt.b;
rt2.g = rt.g;
rt2.r = rt.r;
if (rt.b == 255 && rt.g == 255 && rt.r == 255)
 rt2.a = 255;
else
 rt2.a = 0;
 
printf("%x %x %x ",  rt.b,  rt.g,  rt.r);
 
fseek(g, offset2 , SEEK_SET);
fwrite(&rt2, 1, sizeof(pixel_rgba), g);
 
j++;
}
 
fclose(f);
fclose(g);
 
 
return 0;
}
0
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
14.12.2012, 12:04 13
Вроде...
C++
1
2
3
 d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
 d3ddev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
 d3ddev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
...будет вполне достаточно, перед прорисовкой чтобы нарисовать с прозрачностью, если конечно имеются валидные данные в текстуре с альфой.
0
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 12:27 14
Это включено:
C++
1
2
3
    d3ddev->SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
    d3ddev->SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    d3ddev->SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
0
Миниатюры
Альфа канал  
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 12:40 15
Весь проект
0
Вложения
Тип файла: zip prjc.zip (117.6 Кб, 12 просмотров)
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
14.12.2012, 13:33 16
Так у тебя же нет альфа канала в текстурах они 24-х битные. И далее ты их грузишь как они есть. Я не нашел где ты лопатишь текстуры и добавляешь попиксельно альфу вместо белого цвета. Я же писал тебе выше если нет альфы в текстурах лопать растр и добавляй альфу примеров в инете валом.

А пока можешь глянуть в архив, там твои текстуры в другом формате и есть батничег глянь его. В результате для тех текстур где нужна альфа прозрачность будут сгенерированны новые текстуры (32-х битные). Вот их пробуй загружать, батничег генерит текстуры с префиксом А_%oldfilename%
0
Вложения
Тип файла: rar prjc.rar (114.4 Кб, 5 просмотров)
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 15:22 17
read_bmp.cpp преобразовываю текстуру.
dx2_1_3.cpp сама программа
0
Миниатюры
Альфа канал  
Вложения
Тип файла: zip Prl.zip (311.2 Кб, 4 просмотров)
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
14.12.2012, 16:07 18
read_bmp.cpp преобразовываю текстуру.
Понадеемся что так, ибо там ничего не разобрать толком, как будто писалось не для себя, а на №%%сь (отвали).

Я вот не пойму зачем там портянки из часто повторяющегося кода?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
 
d3ddev->SetTexture(1, lptex17);
d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_MODULATE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);

у тебя есть представление что он делает? У меня нет( может стоит все-таки задать вопрос в теме DirectX ?
0
386 / 212 / 102
Регистрация: 09.04.2012
Сообщений: 635
14.12.2012, 16:31 19
read_bmp.cpp преобразовываю текстуру.
Понадеемся что так, ибо там ничего не разобрать толком, как будто писалось не для себя, а на №%%сь (отвали).
Я в первый раз таким образом разбираю графический формат. Сперва считываю заголовок файла в структуру BITMAPFILEHEADER и копирую его в новый пустой файл. Затем считываю заголовок информации о файле в структуру BITMAPINFOHEADER и изменив в информации разрядность с 24 до 32 записываю структуру в другой файл. Затем считываю все пиксели и записываю их в новый файл с добавленной альфой. Правда я не совсем понимаю, что такое альфа. Что значит 0 или 255?

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


Код C++

Кликните здесь для просмотра всего текста
d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );

d3ddev->SetTexture(1, lptex17);
d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
Этот код взят из статьи http://www.gamedev.ru/code/articles/?id=4141
В MSDN описывается тут, но я еще не сумел детально разобраться :
http://msdn.microsoft.com/ru-r... s.85).aspx
http://msdn.microsoft.com/ru-r... s.85).aspx
http://msdn.microsoft.com/ru-r... s.85).aspx

у тебя есть представление что он делает?
Я не совсем понимаю, что делает этот код. Он задает параметры слоев изображений. Если накладывать вторую текстуру поверх первой, то она полностью закрывает первую текстуру. Чтобы этого избежать, применяется мультитекстурирование, описываемое в статье, то есть создание слоев из текстур.

У меня нет( может стоит все-таки задать вопрос в теме DirectX ?
Я уже задал там вопросы в теме Наложение текстур. Мне сказали "курить мультитекстурирование".
0
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
14.12.2012, 17:15 20
Правда я не совсем понимаю, что такое альфа. Что значит 0 или 255?
Каждая точка в твоем рисунке кодируется либо 24-мя битами по 8 бит на канал RGB
либо же если картинка 32-х битная она содержит еще дополнительный канал на пиксель пресловутую - альфу.
И так что в RGB что в RGBA приходиться 8 бит на канал. R8+G8+B8 = 24бита(RGB) и R8+ G8+ B8+ A8 = 32 бита(RGBA). Так вот в 8 бит можно записать только 256 значений - от 0 до 255. получается что любая составляющая цвета имеет только 256 градаций(2 в степени 8), а в челом же в цвет можно закодировать 256*256*256 = 16777216(RGB 24 бита) цветов.Альфа составляющая мониторами не выводиться, она используется при смешивании с уже существующими пикселями.

Я уже задал там вопросы в теме Наложение текстур. Мне сказали "курить мультитекстурирование".
Для начала было бы проще сделать рисование по слоям, без мультитекстурирования.
сначала землю, море, потом уже с включенным блендингом объекты с прозрачными областями и т.д.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2012, 17:15

Натянуть текстуру с альфа каналом на прозрачный примитив
Все те же чертовы квадраты))) В чем задача: Имеется текстура в бмп формате 32 бита с альфой 16х16...

Текстура с альфа каналом при использовнии glsl
Не рендарится нормально альфа канал. Загрузка текстуры осуществляется через библиотеку DevIL. В...

Баг с цветом при настройке альфа-канала
Здравствуйте. Столкнулся с такой проблемой. Написал простой шейдер для света и задал такие...

*.png файл загружается без альфа-канала
Всем привет! У меня проблема, при загрузке *.png файла с альфа каналом он не распознаётся. Для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.