Entwickler-Ecke

Multimedia / Grafik - Blending


flowstar - Mi 31.12.03 17:44
Titel: Blending
Ich habe eine Landschaft gezeichnet. Es werden immer pro "Feld" 4 Texturen auf dieselbe stelle gezeichnet und jeweils nur eine Ecke gezeichnet. das mache ich mit Blending. Nun sind zwischen 2 "Feldern" aber schwarze Ränder. Wenn ich nur eine Textur zeichne sind diese Ränder nnicht da.
Hier mal der Quellcode:


Delphi-Quelltext
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:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
procedure ZeichneBoden;
var X,Y:Integer;
    XteTextur,YteTextur:Byte;
    BodenTexturBild:Byte;
    BodenTexturTeil:Byte;
    SObjektNr:integer;
begin

 with Boden do  //Falls etwas unmögliches sichbar sein soll berichtigen
 begin
  if Sichtbar.x < 0 then Sichtbar.x := 0;
  if Sichtbar.y < 0 then Sichtbar.y := 0;

  if  Sichtbar.Height > Height then Sichtbar.Height := Height;
  if  Sichtbar.Width  > Width  then Sichtbar.Width  := Width;
  if  Sichtbar.Height + Sichtbar.y > Height then Sichtbar.y := Height - Sichtbar.Height;
  if  Sichtbar.Width  + Sichtbar.x > Width then Sichtbar.x :=  Width  - Sichtbar.Width;
 end;

 SObjektNr := -1;
  {Farben auf normal stellen}
  glcolor4f(1,1,1,1);
  {Richtig hinrücken}
  gltranslatef(-Boden.Sichtbar.width/2/100*CFeldWidth,-Boden.Sichtbar.height/5/100*CFeldHeight,0);

  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);

 for X := 0 to  Boden.Sichtbar.Width  -2 do
 for Y := 0 to  Boden.Sichtbar.Height -2 do
 begin
 SObjektNr := SObjektNr +1;
 glloadname(SObjektNr);

{0,0}
 BodenTexturBild := (Boden.Aussehen[(x + Boden.Sichtbar.x),(y + Boden.Sichtbar.y)] div 16) ;
 BodenTexturTeil := (Boden.Aussehen[(x + Boden.Sichtbar.x),(y + Boden.Sichtbar.y)] mod 16) ;
 BodenTextur[BodenTexturBild].Bind;

 XteTextur := (BodenTexturTeil mod 4);
 YteTextur := (BodenTexturTeil div 4);

  glbegin(GL_Quads);
  glcolor4f(1,1,1,1);
   glTexCoord2f(XteTextur/4,YteTextur/4);
   glvertex3f((x  )/100*CFeldWidth,(y  )/100*CFeldHeight,0.01+Boden.PointHeight[x  +Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);
   glcolor4f(1,1,1,0);
   glTexCoord2f(XteTextur/4+0.25,YteTextur/4);
   glvertex3f((x+1)/100*CFeldWidth,(y  )/100*CFeldHeight,0.01+Boden.PointHeight[x+1+Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);

   glTexCoord2f(XteTextur/4+0.25,YteTextur/4+0.25);
   glvertex3f((x+1)/100*CFeldWidth,(y+1)/100*CFeldHeight,0.01+Boden.PointHeight[x+1+Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);

   glTexCoord2f(XteTextur/4,YteTextur/4+0.25);
   glvertex3f((x  )/100*CFeldWidth,(y+1)/100*CFeldHeight,0.01+Boden.PointHeight[x  +Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);
  glend();



{1,0}
 BodenTexturBild := (Boden.Aussehen[(x + Boden.Sichtbar.x +1),(y + Boden.Sichtbar.y)] div 16) ;
 BodenTexturTeil := (Boden.Aussehen[(x + Boden.Sichtbar.x +1),(y + Boden.Sichtbar.y)] mod 16) ;
 BodenTextur[BodenTexturBild].Bind;

 XteTextur := (BodenTexturTeil mod 4);
 YteTextur := (BodenTexturTeil div 4);

  glbegin(GL_Quads);

   glTexCoord2f(XteTextur/4,YteTextur/4);
   glvertex3f((x  )/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500)  ;
  glcolor4f(1,1,1,1);
   glTexCoord2f(XteTextur/4+0.25,YteTextur/4);
   glvertex3f((x+1)/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500)  ;
  glcolor4f(1,1,1,0);

   glTexCoord2f(XteTextur/4+0.25,YteTextur/4+0.25);
   glvertex3f((x+1)/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500)  ;

   glTexCoord2f(XteTextur/4,YteTextur/4+0.25);
   glvertex3f((x  )/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500 ) ;
  glend();


{1,1}
 BodenTexturBild := (Boden.Aussehen[(x + Boden.Sichtbar.x+1),(y + Boden.Sichtbar.y+1)] div 16) ;
 BodenTexturTeil := (Boden.Aussehen[(x + Boden.Sichtbar.x+1),(y + Boden.Sichtbar.y+1)] mod 16) ;
 BodenTextur[BodenTexturBild].Bind;

 XteTextur := (BodenTexturTeil mod 4);
 YteTextur := (BodenTexturTeil div 4);

  glbegin(GL_Quads);

   glTexCoord2f(XteTextur/4,YteTextur/4);
   glvertex3f((x  )/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);

   glTexCoord2f(XteTextur/4+0.25,YteTextur/4);
   glvertex3f((x+1)/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);
  glcolor4f(1,1,1,1);
   glTexCoord2f(XteTextur/4+0.25,YteTextur/4+0.25);
   glvertex3f((x+1)/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);
  glcolor4f(1,1,1,0);

   glTexCoord2f(XteTextur/4,YteTextur/4+0.25);
   glvertex3f((x  )/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);
  glend();


{0,1}
 BodenTexturBild := (Boden.Aussehen[(x + Boden.Sichtbar.x),(y + Boden.Sichtbar.y+1)] div 16) ;
 BodenTexturTeil := (Boden.Aussehen[(x + Boden.Sichtbar.x),(y + Boden.Sichtbar.y+1)] mod 16) ;
 BodenTextur[BodenTexturBild].Bind;

 XteTextur := (BodenTexturTeil mod 4);
 YteTextur := (BodenTexturTeil div 4);

  glbegin(GL_Quads);

   glTexCoord2f(XteTextur/4,YteTextur/4);
   glvertex3f((x  )/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);

   glTexCoord2f(XteTextur/4+0.25,YteTextur/4);
   glvertex3f((x+1)/100*CFeldWidth,(y  )/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y  +Boden.Sichtbar.y]/500);

   glTexCoord2f(XteTextur/4+0.25,YteTextur/4+0.25);
   glvertex3f((x+1)/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x+1+Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);
  glcolor4f(1,1,1,1);
   glTexCoord2f(XteTextur/4,YteTextur/4+0.25);
   glvertex3f((x  )/100*CFeldWidth,(y+1)/100*CFeldHeight,Boden.PointHeight[x  +Boden.Sichtbar.x,y+1+Boden.Sichtbar.y]/500);
  glend();

end;
gldisable(gl_Blend);
end;


Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt


flowstar - Sa 03.01.04 17:04

Ich hab jetzt rausgefunden, dass es an dem Alpha Blending liegt.


Delphi-Quelltext
1:
glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);                    


Aber was kann ich dagegen machen?


Christian S. - Sa 03.01.04 17:09

Hallo!

Bitte ändere den Titel des Topics da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Delphi-Forum.de Richtlinien:

Richtlinien hat folgendes geschrieben:

1.1 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]

Einfach oben bei deinem ersten Beitrag auf "Edit" klicken und den Titel ändern. Dank Dir!

Gruß Peter Lustig


Anonymous - Sa 03.01.04 17:50

Schwarze Ränder hatte ich mal wegen der Texturgröße. Es ist immer am Besten, wenn Texturhöhe und -breite 2^n sind, da nur wenige GraKas mit anderen Größen zurechtkommen.


flowstar - Sa 03.01.04 19:38

ne daran liegts leider nich die Texturen haben eine breite und höhe 2^n.
Die Landschaft sieht do Schachbrettartig aus, als ob die Rechtecke nicht direkt nebeneinander liegen würden.
Es muss irgendwas mit dem Blending zu tun haben, denn wenn ich es ohne blending mache und nur eine Textur übereinander zeichne funktioniert es.