Jump to content

[delphi] OpenGL i 32 bit tekstury z kanałem Alpha


sybic

Recommended Posts

Z literatury wiem, że jeśli do teksturowania zastosuje się 32 tekstury to tam gdzie w kanale alpha będzie czarne obiekt będzie przeźroczysty, tak?

 

Otóż mam 24 bit bitmapę.

Skutkiem wydania polecenia uzyskuje obiekt pokryty bitmapą.

glTexImage2D(GL_TEXTURE_2D, 0, 3, x, y, 0, GL_BGR, GL_UNSIGNED_BYTE, @buff[54]);

 

Nie mam doświadczenia z kanałem Alpha, ale zdaje się trzeba go wcisnąć na czwartym bajcie.

Przygotowałem więc drugą bitmapę bmp_a o takich samych rozmiarach, też 24 bit na której na czarno domalowałem to co ma być przeźroczyste, a resztę na biało.

 

Poniższą procedurą przygotowałem odpowiedni bufor

procedure Bmp_AlphaToBuff(bmp,bmp_a:TBitMap; var buff_alpha:array of byte);
var x,y,k:integer;
   P,p_a:PByteArray;
begin
k:=0;
   for y:=bmp.Height-1 downto 0  do
     begin
       p:=bmp.ScanLine[y];
       p_a:=bmp_a.ScanLine[y];
       x:=0;
       repeat
          buff_alpha[k]:=p^[x];
          buff_alpha[k+1]:=p^[x+1];
          buff_alpha[k+2]:=p^[x+2];
          if p_a^[x]=0 then buff_alpha[k+4]:=0 else buff_alpha[k+4]:=255;
         // nawet jesli daje buff_alpha[k+4]:=0; to brak efektu
         x:=x+3;
         k:=k+4;
       until x>(bmp.Width-1)*3;
     end;

end;

Funkcja glTexImage2D, uległa pewnym modyfikacjom i teraz wygląda tak :

glTexImage2D(GL_TEXTURE_2D, 0, 4,x, y, 0, GL_BGRA, GL_UNSIGNED_BYTE, @buff_alpha[0]);

 

i wszystko działa, ale to co domalowałem na czarno przeźroczyste nie jest.

W czym może być problem?

Link to comment
Share on other sites

Działa i chyba działało od początku, ale nie uzyskałem zamierzonego efektu.

Zacznę od początku. Mianowicie chcę uzyskać połowę sfery (taka połówka orzecha). Obserwator w środku. Pomyślałem sobie, że jeśli sferę pokryje 32 bit teksturą z kanałem alpha do połowy pokryte kolorem czarnym to uzyskam przeźroczystość owej sfery. Efekt teksturowania jest chyba pomyślny, bo to co w kanale alpha jest czarne, to na sferze jest nie pokolorowane. Jednak to co za sferą (linie) są niewidoczne.

A może tak ma być?

Sam już nie wiem...

Sama procedura tworzenia bufora jest dobra, bo procedura wyświetlania glDrawPixels, transparentnym bit map działa bez zarzutu.

Link to comment
Share on other sites

Bawię się dalej i okazuje się, że sfera jest jednak przeźroczysta, ale dla innych obiektów, np. sfer, a dla linii będącej za sferą rysowanej glVertex3f, oraz bitmap rysowanych glDrawPixels już nie. Może tak ma być i ja wybrałem złą koncepcje?

A chodzi mi głównie o napisy, które znajdują się na sferze rzucanych glDrawPixels. Otóż w zależności od położenia fragmenty tych napisów przechodzi na drugą stronę sfery przez co stają się niewidoczne i to jest zasadniczy problem, z którym się aktualnie zmagam. Na tej sferze chciałbym sobie też rzucić też obiekty z wcześniej przygotowanych bitmap i tego też nie mogę zrealizować.

Pewną metodą-protezą jest nanoszenie napisów i innych obiektów bliżej sfery. Wtedy nie wychodzą na zewnątrz, ale są w nie właściwych miejscach.

Link to comment
Share on other sites

Zerknij np. tu: http://www.opengl.org/wiki/Transparency_Sorting

 

i prawdopodobnie w tym tkwi Twój problem.

 

 

Ew. to co szybko znalazłem na Warsztacie:

 

Jak rysować półprzezroczyste obiekty?

 

Użyj alfa-testingu lub alfa-blendingu.

 

Niezależnie czy w DirectX czy w OpenGL, rysowanie obiektów mających obszary przezroczyste lub półprzezroczyste wiąże się z uaktywnieniem funkcji Alpha-Testing lub Alpha-Blending oraz dokonaniem odpowiednich ustawień. Przykładowo, zwyczajny alfa-blending to ustawienia: BlendOp=ADD, SrcBlend=SRCALPHA, DestBlend=INVSRCALPHA, zaś alfa-blending addytywny to: BlendOp=ADD, SrcBlend=SRCALPHA, DestBlend=ONE.

 

Istotna jest przy stosowaniu półprzezroczystości również kolejność rysowanych obiektów. Konieczne może być ich sortowanie w kolejności od najdalszych do najbliższych względem kamery. Trzeba też dobrze zaprojektować ogólny proces renderowania, żeby obiekty półprzezroczyste rysować na końcu mając na względzie, jak w ich przypadku zadziała Z-bufor. Poczytaj o tym więcej w swoim ulubionym tutorialu albo książce do OpenGL czy DirectX.

 

Temat ten był też wielokrotnie wałkowany na forum:

http://forum.gamedev.pl/index.php/topic,3442.0.html

http://forum.gamedev.pl/index.php/topic,3460.0.html

http://forum.gamedev.pl/index.php/topic,1153.0.html

http://forum.gamedev.pl/index.php/topic,3702.0.html

http://forum.gamedev.pl/index.php/topic,2684.0.html

http://forum.gamedev.pl/index.php/topic,3500.0.html

http://forum.gamedev.pl/index.php/topic,3724.0.html

http://forum.gamedev.pl/index.php/topic,11399.0.html

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...