Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 06, 2025 19:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Blend-Maps
BeitragVerfasst: Do Nov 15, 2007 23:05 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Ich bins mal wieder mit meinen dämlichen Fragen^^ (Bin anscheinend wirklich zu blöd für diese Materie, hab mit leider etz son Projekt eingehalst....)

Folgendes: Ich möchte im Tutorial 7 das Thema 'Überläufer 2" nachvollziehen. Irgendwie versteh ich net, wie ich zwei Map so mit einer 3. Map kombiniere, das die 3. Map als Blend-Map fungiert(Also im Grunde genommen nicht sichtbar ist). Könnte mir vllt einer von euch evtl. mir ein Code-Beispiel geben???? Wäre echt toll
Vielen Dank scho mal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 16, 2007 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na. So dämlich ist die Frage gar nicht. Einige Grundprinzipien von OpenGL sind nicht ganz so einfach zu verstehen. Allerdings wenn man diese verstanden hat dann ist es recht einfach. Also nicht entmutigen lassen und bei Problemen oder Verständnissfragen einfach fragen. ;)

Dieses Kapitel ist aber nicht so ohne weiteres mit dem Wissen möglich was oberhalb besprochen wurde. Das was du dafür benötigen wirst (was das alles zu mindest extrem vereinfacht) ist Multitexturing. Wie das geht findest du im Kapitel "Die Kraft des Gemeinsamen!". Der Trick dahinter ist dann ganz einfach der, dass in OpenGL alles miteinander Multipliziert/Kombiniert wird.

Aber jetzt mal etwas ins Detail. Du hast 3 Texturen. 2 Davon sind normale Landsschaftstexturen. Und eine davon ist deine Blendmap. Diese sollte wohl idealerweise ein graustufen Bild sein. Also nicht nur keine Farben haben sondern direkt ein graustufen Bild. Als Farbmodus gibt es eigentlich überall direkt Grau. Die beiden anderen Texturen kannst du normal als RGB oder RGBA laden und die graustufen Textur lädst du als ALPHA. Denn ALPHA gibt an wie sichtbar etwas sein soll. Und damit wäre das eine Textur die nicht sichtbar wäre. Aber sie würde die Sichtbarkeit von anderen Dingen steuern.

Die ersten Flächen mit der Textur 1 kannst du ganz normal zeichnen. Allerdings bei der Zweiten bindest du die Alphatextur mittels Miltitexturing auch mit dazu. Dadurch sieht es dann intern so aus als wäre der Alphakanal bereits in der Textur enthalten. Und dann verhält es sich so als wäre es eine einzige Textur RGBA Textur. Nur eben, dass dieser Verlauf aus der dritten Textur stammt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 22:35 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Erstmal danke, hätte des Tut weiterlesen sollen.....

Leider hab ich etz noch ein Problem: Ich möchte so nen Farbverlauf von Alpha=1 zu Alpha =0 machen, aba halt net geradlinig, sondern alpha=0 sollte schon ein wenig früher erreicht werden. Deswegen dacht ich mir, ich mach nen Farbervlauf von Grau nach Weiß auf ein .jpg und Blends via Multitexturing. Wenn ichs als .jpg mach passiert gar nix (trotz richtig gesetzter glcolor4f-Werte), wenn ichs als .png mach bekommt die Textur misteriöse Streifen...

Kann mir jemand helfen? THX!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 23:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich muss gestehen, dass meinen Vorstellungskraft für "misteriöse Streifen" gerade nicht ausreicht. ;) Deswegen mal eine Bitte. Mach davon mal bitte ein Bild und häng es an bzw würde etwas code auch helfen. Auch wie du die Texturen lädst. Wie ich oberhalb aber schon mal gesagt habe. Die Texturen sollten Graustufen sein und als Alpha geladen werden. Und das sollte der Loader auch unterstützen.

Ansonsten kann ich dir derzeit nicht sagen was falsch ist. Denn du müsstest "lediglich" dafür sorgen, dass der Alphakanal entsprechend gesetzt ist und blending aktiv ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 22, 2007 16:32 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Joa, srry:

Aaaaalso erstmal der Render-Code:
Code:
  1.  
  2.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  3.  
  4.   glMatrixMode(GL_PROJECTION);
  5.   glLoadIdentity;
  6.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  7.   glMatrixMode(GL_MODELVIEW);
  8.   glTranslatef(0, 0, -5);
  9.   glPopMatrix();
  10.   glPushMatrix();
  11.  
  12.  
  13.   glEnable(GL_BLEND);
  14.   glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);
  15.  
  16.   gltranslateF(-2.3, -2, 0);
  17.   glrotatef(60, 0, 1, 0);
  18.    glScaleF(0.8, 0.8, 1);
  19.   glBegin(GL_QUADS);
  20.    glColor4f(1, 1, 1, 0); glVertex3f(0, 0, 0);
  21.    glColor4f(1, 1, 1, 0); glVertex3f(3.75, 0, 0);
  22.    glColor4f(1, 1, 1, 0.7); glVertex3f(3.75, 2.5, 0);
  23.    glColor4f(1, 1, 1, 0.7); glVertex3f(0, 2.5, 0);
  24.   glEnd;
  25.   glPopMatrix();
  26.   glPushMatrix();
  27.  
  28.  
  29.  
  30.   glActiveTextureARB(GL_TEXTURE0_ARB);
  31.   glEnable(GL_TEXTURE_2D);
  32.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  33.   glBindTexture(GL_TEXTURE_2D, TexID[2]);
  34.  
  35.   glActiveTextureARB(GL_TEXTURE1_ARB);
  36.   glEnable(GL_TEXTURE_2D);
  37.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  38.   glEnable(gl_BLEND);
  39.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  40.   glBindTexture(GL_TEXTURE_2D, BlendID);
  41.  
  42.   glTranslateF(-1.875, -2.8, 0);
  43.   glBegin(GL_QUADS);
  44.     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,0);glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,0);; glVertex3f(0, 0, 0);
  45.     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,0);glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,0);; glVertex3f(3.75, 0, 0);
  46.     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,1);glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,1); glVertex3f(3.75, 2.5, 0);
  47.     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,1);glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,1); glVertex3f(0, 2.5, 0);
  48.   glEnd;
  49.  
  50.   SwapBuffers(DC);


Ich hab den Code n bisschen gekürzt, alles was davor stand funktinionert, ich denk der Fehler liegt in den Zeilen....

Hier noch der Texturen-Code:

Code:
  1. var
  2.   tex : PSDL_Surface;
  3.   e: string;
  4. begin
  5.    e:= 'C:\glass04.jpg';
  6.     glGenTextures(2, @TexID[1]);
  7.     glGenTextures(1, @blendID);
  8.  
  9.     glBindTexture(GL_TEXTURE_2D, TexID[1]);
  10.     tex := IMG_Load(Pchar('C:\pool.jpg'));
  11.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  13.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  14.     SDL_FreeSurface(tex);
  15.  
  16.  
  17.     glBindTexture(GL_TEXTURE_2D, TexID[2]);
  18.     tex:= IMG_Load(Pchar('C:\glass04.jpg'));
  19.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  20.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  21.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  22.     SDL_FreeSurface(tex);
  23.  
  24.     glBindTexture(GL_TEXTURE_2D, BlendID);
  25.     tex:= IMG_Load(PChar('C:\blend.jpg'));
  26.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  27.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  28.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  29.     SDL_FreeSurface(tex);


Bild ist angefügt. Ich fänds am besten, wenn ich als Blend-Map n normales .jpg pic nehmen könnte(mit Graustufe halt), aba irgendwie geht des dann gar net.
Das angefügte Bild entsteht, wenn ich mit nem .png Bild rendere


// Edit Lossy: Code durch Pascaltags ersetzt


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 23, 2007 10:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bin gestern leider nicht mehr zum Antworten gekommen.

Der Code ist eigentlich bis auf Kleinigkeiten ziemlich richtig. Allerdings eines der wohl wichtigsten Punkte stimmt nicht. Und zwar das was ich mir schon gedacht hatte. Da trägt SDL_image aber auch eine Teilschuld mit. Ungeachtet dessen ob deine Blendmap ein echtes Graustufenbild ist oder nicht. SDL_image lädt es als RGB und du übergibst es auch als RGB. Also ist es für OpenGL eine ganz normale RGB Textur. Wichtig ist aber, dass wir eine ALPHA Textur brauchen. Sonst wird es nicht funktionieren.

Also muss das laden der Textur etwas umgestellt werden.
Code:
  1.   glBindTexture(GL_TEXTURE_2D, BlendID);
  2.   tex := IMG_Load('blend_map.jpg');
  3.  
  4.   // Surface convertieren
  5.   FillChar(Format, SizeOf(TSDL_PixelFormat), 0);
  6.   format.BitsPerPixel := 8;
  7.   format.BytesPerPixel := 1;
  8.   format.RMask := $FF;
  9.   format.GMask := $FF;
  10.   format.BMask := $FF;
  11.   Conv := SDL_ConvertSurface (tex, @format, 0);
  12.   SDL_FreeSurface(tex);
  13.  
  14.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  16.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  17.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  18.  
  19.   // Wichtig jetzt hier auch direkt alpha als Format angeben.
  20.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Conv^.w, Conv^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Conv^.pixels);
  21.   SDL_FreeSurface(Conv);

Leider macht SDL beim Konvertieren richtig murks, denn die vorher existierenden feinen Abstufungen in den RGB Werten (die eigentlich sowieso nur ein Kanal sein sollten) Sind danach auf 8 Stufen (4 Bit) runtergebrochen. Ich hatte Testweise auch mal eine graustufen Palette mit angegeben allerdings hatte das gar nicht gebracht. Mir fehlt aber gerade auch die Zeit da was zu machen. Aber zum Test genügt es.

Beim Zeichnen musste auch etwas angepasst werden. Und zwar die erste Textur solltest du immer voll darstellen. Da die Texturkoordinaten nicht vergessen. Und die anderen via Multitexturing drüber blenden. In etwa so.

Code:
  1.   glActiveTextureARB(GL_TEXTURE0_ARB);
  2.   glEnable(GL_TEXTURE_2D);
  3.   glBindTexture(GL_TEXTURE_2D, TexID[1]);
  4.   glBegin(GL_QUADS);
  5.     glTexCoord2f(0, 0);  glVertex3f(-1, -1, 0);
  6.     glTexCoord2f(1, 0);  glVertex3f( 1, -1, 0);
  7.     glTexCoord2f(1, 1);  glVertex3f( 1,  1, 0);
  8.     glTexCoord2f(0, 1);  glVertex3f(-1,  1, 0);
  9.   glEnd;
  10.  
  11. // via Multitexturing die zweite Textur mit dem Alpha kombinieren und über die Erste blenden.


PS: Mit GL_ARB_texture_env_combine sollte es auch möglich sein die 3 Texturen mit einem Mal zu kombinieren. Wie das allerdings dann genau aussieht weiß ich gerade nicht. Müsste ich selbst erst mal probieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 23, 2007 15:21 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
THX für die Hilfe:

Abaaa(war ja klar, das ich des noch net auf die Reihe bekomm...): Mein Delphi meldet bei format.Gmask un bei allen vorhergehenden Argumente nur
'Es gibt keine überladene Version von Format, die man mit diesem Argument aufrufen kann'
Hab ich irgendwas net eingebunden????


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 23, 2007 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hmmm. Nee. Ich habe etwas vergessen. ;)

Und zwar folgende Variablen benutze ich.
Code:
  1. var
  2.   tex, Conv : PSDL_Surface;
  3.   format : TSDL_PixelFormat;


PS: Falls es dann trotzdem noch Probleme geben sollte dann nenne die Variable Format einfach anders, denn es gibt auch eine Methode namens Format. Könnte durchaus zu problemen führen, wenn du beides gleichtzeitig nutzen wolltest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 26, 2007 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Da mich das Konvertieren der Surface nicht so wirklich glücklich macht hier mal ein "besserer" weg. Wenn man davon absieht, dass man so etwas überhaupt machen muss.

Code:
  1.   procedure RedToAlpha(Tex: PSDL_Surface; Buff: pByte);
  2.   var
  3.     Idx, SourceWidth: Integer;
  4.     pSource: pByte;
  5.   begin
  6.     pSource := Tex^.pixels;
  7.     SourceWidth := Tex^.format^.BytesPerPixel;
  8.  
  9.     for Idx := 0 to Tex^.w * Tex^.h do begin
  10.       Buff^ := pSource^;
  11.  
  12.       Inc(pSource, SourceWidth);
  13.       Inc(Buff);
  14.     end;
  15.   end;
  16.  
  17. begin
  18.   glBindTexture(GL_TEXTURE_2D, BlendID);
  19.   Tex := IMG_Load('blend_map.jpg');
  20.   GetMem(Buff, Tex^.w * Tex^.h);  // Eigenen Speicher anlegen
  21.   RedToAlpha(Tex, Buff);          // Ersten Kanal aus dem Surface in den Buffer übertragen
  22.  
  23.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  24.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  25.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  26.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  27.  
  28.   // Mit dem Buffer eine Alphatextur erstellen
  29.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Tex^.w, Tex^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Buff);
  30.  
  31.   FreeMem(Buff);
  32.   SDL_FreeSurface(Tex);


Und da die meisten Grafikkarte auch mehr als nur 2 Texturen in der Fixed Function können hier mal ein Code der 3 Textureinheiten benutzt und diese dann so überblendet wie es die Blendmap vorsieht. Wirklich neu ist nur die Textur2 und der Combiner den sie benutzt. Der Combiner ignoriert aber vollständig die Werte von glColor. Also sowohl RGB als auch transparenz. Sollte das benötigt werden kann kann das mit der 4ten TMU noch realisieren. Habe ich aus Übersicht weggelassen und eigentlich wäre das dann schon ein bisschen getrickst (pfuschig). Da würden sich dann schon fast Shader anbieten.

Code:
  1.   // Textur 1 setzen
  2.   glActiveTexture(GL_TEXTURE0);
  3.   glBindTexture(GL_TEXTURE_2D, TexID[1]);
  4.   glEnable(GL_TEXTURE_2D);
  5.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  6.  
  7.   // BlendMap setzen
  8.   glActiveTexture(GL_TEXTURE1);
  9.   glBindTexture(GL_TEXTURE_2D, blendID);
  10.   glEnable(GL_TEXTURE_2D);
  11.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  12.  
  13.   // Textur 2 setzen
  14.   glActiveTexture(GL_TEXTURE2);
  15.   glBindTexture(GL_TEXTURE_2D, TexID[2]);
  16.   glEnable(GL_TEXTURE_2D);
  17.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  18.  
  19.   // Alpha mit der der aktuellen Textur überschreiben (also 1)
  20.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
  21.  
  22.   // RGB normal blenden und die Parameter setzen
  23.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
  24.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE2);
  25.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE0);
  26.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE1);
  27.  
  28.   // Fläche mit 3 Texturkoordinaten zeichnen
  29.   glBegin(GL_QUADS);
  30.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 0);
  31.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 0);
  32.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 0);
  33.     glVertex3f(-1, -1, 0);
  34.  
  35.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 0);
  36.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 0);
  37.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 0);
  38.     glVertex3f( 1, -1, 0);
  39.  
  40.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 1);
  41.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 1);
  42.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 1);
  43.     glVertex3f( 1,  1, 0);
  44.  
  45.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 1);
  46.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 1);
  47.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 1);
  48.     glVertex3f(-1,  1, 0);
  49.   glEnd;
  50.  
  51.   // TMUs deaktivieren
  52.   glActiveTextureARB(GL_TEXTURE2);
  53.   glBindTexture(GL_TEXTURE_2D, 0);
  54.   glDisable(GL_TEXTURE_2D);
  55.  
  56.   glActiveTextureARB(GL_TEXTURE1);
  57.   glBindTexture(GL_TEXTURE_2D, 0);
  58.   glDisable(GL_TEXTURE_2D);
  59.  
  60.   glActiveTextureARB(GL_TEXTURE0);
  61.   glBindTexture(GL_TEXTURE_2D, 0);
  62.   glDisable(GL_TEXTURE_2D);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 26, 2007 17:03 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
danke für die Mühe, hat aba leider rein gar nichts gebracht.

Es passiert nämlich rein gar nichts, keinerlei Blend-Map, nichts- Ach doch, ein weiteres Problem: wenn ich etz die Procedure 'render' zweimal ausführe, werden meine Quads, welche beim ersten Durchgang noch sauber texturiert waren, plötzlich weiß.
Ich häng nochmal meinen kompletten Render Code an, vllt bin ich einfach nur zu bescheuert ums richtig zu machen

Code:
  1. procedure TGLForm.Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  8.   glMatrixMode(GL_MODELVIEW);
  9.   glTranslatef(0, 0, -5);
  10.   glPopMatrix();
  11.   glPushMatrix();
  12.   glTranslatef(-2.3, -0.7, 0);
  13.    glBindTexture(GL_TEXTURE_2D, TexID[1]);
  14.    glrotatef(60, 0, 1, 0);
  15.    glScaleF(0.8, 0.8, 1);
  16.    glBegin(GL_QUADS);
  17.     glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
  18.     glTexCoord2f(0, 1); glVertex3f(3.75, 0, 0);
  19.     glTexCoord2f(1, 1); glVertex3f(3.75, 2.5, 0);
  20.     glTexCoord2f(1, 0); glVertex3f(0, 2.5, 0);
  21.    glEnd;
  22.   glPopMatrix();
  23.   glPushMatrix();
  24.  
  25.   glTranslateF(-1.875, -0.7, 0);
  26.   glBindtexture(GL_TEXTURE_2D, TexID[2]);
  27.   glBegin(GL_QUADS);
  28.    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
  29.     glTexCoord2f(0, 1); glVertex3f(3.75, 0, 0);
  30.     glTexCoord2f(1, 1); glVertex3f(3.75, 2.5, 0);
  31.     glTexCoord2f(1, 0); glVertex3f(0, 2.5, 0);
  32.    glEnd;
  33.    glPopMatrix();
  34.    glPushMatrix();
  35.  
  36.   glTranslateF(2.3, -0.7, 0);
  37.   glBindTexture(GL_TEXTURE_2D, TexID[1]);
  38.   glrotatef(120, 0, 1, 0);
  39.   glScaleF(0.8, 0.8, 1);
  40.   glbegin(GL_QUADS);
  41.     glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
  42.     glTexCoord2f(0, 1); glVertex3f(3.75, 0, 0);
  43.     glTexCoord2f(1, 1); glVertex3f(3.75, 2.5, 0);
  44.     glTexCoord2f(1, 0); glVertex3f(0, 2.5, 0);
  45.   glEnd;
  46.   glPopMatrix();
  47.   glPushMatrix();
  48.  
  49.   glTranslateF(-1.875, -3, -0.001);
  50.    glBegin(GL_QUADS);
  51.     glColor3f(0, 0, 0);glVertex3f(0, 0, 0);
  52.     glColor3f(0, 0, 0);glVertex3f(3.75, 0, 0);
  53.     glColor3f(0, 0, 0);glVertex3f(3.75, 2.5, 0);
  54.     glColor3f(0, 0, 0);glVertex3f(0, 2.5, 0);
  55.    glEnd;
  56.    glPopMatrix();
  57.    glPushMatrix();
  58.  
  59.   glEnable(GL_BLEND);
  60.   glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);
  61.  
  62.   gltranslateF(-2.3, -2, 0);
  63.   glrotatef(60, 0, 1, 0);
  64.    glScaleF(0.8, 0.8, 1);
  65.   glBegin(GL_QUADS);
  66.    glColor4f(1, 1, 1, 0); glVertex3f(0, 0, 0);
  67.    glColor4f(1, 1, 1, 0); glVertex3f(3.75, 0, 0);
  68.    glColor4f(1, 1, 1, 0.7); glVertex3f(3.75, 2.5, 0);
  69.    glColor4f(1, 1, 1, 0.7); glVertex3f(0, 2.5, 0);
  70.   glEnd;
  71.   glPopMatrix();
  72.   glPushMatrix();
  73.  
  74.   //-------------------------------------------------------------------------
  75.  
  76.   glActiveTextureARB(GL_TEXTURE0);
  77.   glBindTexture(GL_TEXTURE_2D, TexID[2]);
  78.   glEnable(GL_TEXTURE_2D);
  79.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  80.  
  81.   glActiveTextureARB(GL_TEXTURE1);
  82.   glBindTexture(GL_TEXTURE_2D, BlendID);
  83.   glEnable(GL_TEXTURE_2D);
  84.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  85.  
  86.   glActiveTexture(GL_TEXTURE2);
  87.   glBindTexture(GL_TEXTURE_2D, TexID[2]);
  88.   glEnable(GL_TEXTURE_2D);
  89.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  90.  
  91.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
  92.  
  93.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
  94.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE2);
  95.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE0);
  96.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE1);
  97.  
  98.   glTranslateF(-1.875, -3.3, 0);
  99.   glBegin(GL_QUADS);
  100.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 0);
  101.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 0);
  102.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 0);
  103.     glVertex3f(0, 0, 0);
  104.  
  105.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 0);
  106.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 0);
  107.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 0);
  108.     glVertex3f(3.75, 0, 0);
  109.  
  110.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 1);
  111.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 1);
  112.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 1);
  113.     glVertex3f(3.75, 2.5, 0);
  114.  
  115.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 1);
  116.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 1);
  117.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 1);
  118.     glVertex3f(0, 2.5, 0);
  119.   glEnd;
  120.  
  121.  
  122.  glActiveTextureARB(GL_TEXTURE2);
  123.  glBindTexture(GL_TEXTURE_2D, 0);
  124.  glDisable(GL_TEXTURE_2D);
  125.  
  126.  glActiveTextureARB(GL_TEXTURE1);
  127.  glBindTexture(GL_TEXTURE_2D, 0);
  128.  glDisable(GL_TEXTURE_2D);
  129.  
  130.  glActiveTextureARB(GL_TEXTURE0);
  131.  glBindTexture(GL_TEXTURE_2D, 0);
  132.  glDisable(GL_TEXTURE_2D);
  133.  
  134.  
  135.   glDisable(GL_BLEND);
  136.   SwapBuffers(DC);
  137. end;


Und meine (beiden) textur-codes:

Code:
  1. procedure TglForm.textur;
  2. var
  3.    tex : PSDL_Surface;
  4.   format2 : TSDL_PixelFormat;
  5.   e: string;
  6. begin
  7.    e:= 'C:\glass04.jpg';
  8.     glGenTextures(2, @TexID[1]);
  9.     glGenTextures(1, @blendID);
  10.  
  11.     glBindTexture(GL_TEXTURE_2D, TexID[1]);
  12.     tex := IMG_Load(Pchar('C:\pool.jpg'));
  13.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  15.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  16.     SDL_FreeSurface(tex);
  17.  
  18.  
  19.     glBindTexture(GL_TEXTURE_2D, TexID[2]);
  20.     tex:= IMG_Load(Pchar('C:\glass04.jpg'));
  21.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  22.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  23.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  24.     SDL_FreeSurface(tex);
  25. end;
  26.  
  27. procedure RedToAlpha(Tex: PSDL_Surface; Buff: pByte);
  28. var
  29.  Idx, SourceWidth: Integer;
  30.  pSource: pByte;
  31.  
  32. begin
  33.  pSource := Tex^.pixels;
  34.  SourceWidth := Tex^.format^.BytesPerPixel;
  35.   for Idx := 0 to Tex^.w * Tex^.h do begin
  36.    Buff^ := pSource^;
  37.    Inc(pSource, SourceWidth);
  38.     Inc(Buff);
  39.    end;
  40.  begin
  41.   glBindTexture(GL_TEXTURE_2D, BlendID);
  42.   Tex := IMG_Load('C:\blend.jpg');
  43.   GetMem(Buff, Tex^.w * Tex^.h);
  44.   RedToAlpha(Tex, Buff);
  45.  
  46.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  47.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  48.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  49.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  50.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Tex^.w, Tex^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Buff);
  51.    FreeMem(Buff);
  52.    SDL_FreeSurface(Tex);
  53.  end;
  54. end;


// Edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 26, 2007 21:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bitte benutz für Quellcode die Pascaltags. Danke. :)

Der zweite Quellcodeteil kann so nicht funktionieren. Ist da beim Posten was schief gelaufen? Ich habe den nicht versucht aber da wird der Kompiler alleine schon einen Fehler von sich geben. Deswegen habe ich den gelassen den ich gepostet hatte.

Das was du ändern musst ist, dass du auch 2 unterschiedliche Texturen benutzt. Du benutzt beides male die aus TexID[2]. Somit blendest du sie mit sich selber. Was ein und das selbe Bild ergibt. Aber damit das funktioniert wird auch OpenGL 1.3 benötigt. Evtl könnte es auch sein, dass das gar nicht unterstützt wird. Du solltest das mal überprüfen ob dein System entsprechen "aktuell" ist.

Du solltest mal deine Matrizen überarbeiten. Du erzeugst beim ersten Durchgang einen Stack Underflow. Ich denke mal die Matrizen sind deswegen so komisch, weil sich das Bild sonst zerschießt. Normal setzt man aber die ModelView Matrix vor dem Rendern zurück.
Code:
  1.   glMatrixMode(GL_MODELVIEW);
  2.   glLoadIdentity;

Und dann nur noch. Mehr wird gar nicht benötigt.
Code:
  1.   glPushMatrix;
  2.   Blah;
  3.   glPopMatrix;


Außerdem solltest du auch mal nach Fehler abfragen. Besonders beim Entwicklen ist so etwas fundamental wichtig.
Code:
  1. var
  2.   Error: Cardinal;
  3. begin
  4.   // Zeichnen
  5.  
  6.   Error := glGetError;
  7.   if Error <> 0 then
  8.     Caption := gluErrorString(Error);
  9. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 14:20 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Ähhhm, etz blick ich überhaupt nimmer durch.

Wohin soll das etz :
Code:
  1. glBindTexture(GL_TEXTURE_2D, BlendID);
  2.   Tex := IMG_Load('C:\blend.jpg');
  3.   GetMem(Buff, Tex^.w * Tex^.h);
  4.   RedToAlpha(Tex, Buff);
  5.  
  6.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  7.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  10.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Tex^.w, Tex^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Buff);
  11.    FreeMem(Buff);
  12.    SDL_FreeSurface(Tex);


In den texturen Teil????? Dann beschwert sich Delphi über die Var Buff.

Und zu den texturen: Setzt ich die net am Anfang meines Render-Codes jedes mal zurück.
Jaaaah, ich weiß, ich bin schwer von Begriff, srry


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Tu mir mal bitte einen gefallen. Sollte das unten nicht helfe, dann schick mir mal bitte dein gesammtes Projekt. Meine Mailadresse findest du auf der Teamseite oder auf meiner Webseite unter Kontakt. Ich möchte mir das dann mal komplett anschauen. Und bitte dann auch mit allen benötigten Bildern etc.

Die Funktion RedToAlpha macht nichts anderes als den ersten Kanal in dem SDLSurface zu extrahieren. Buff ist eine Variable vom typ pByte dort wo sich auch Tex befindet. Hatte ich vergessen bzw nicht direkt mit erwähnt. Sollte als in etwa so aussehen.

Code:
  1. procedure RedToAlpha(Tex: PSDL_Surface; Buff: pByte);
  2. var
  3.   Idx, SourceWidth: Integer;
  4.   pSource: pByte;
  5. begin
  6.   pSource := Tex^.pixels;
  7.   SourceWidth := Tex^.format^.BytesPerPixel;
  8.   for Idx := 0 to Tex^.w * Tex^.h do begin
  9.     Buff^ := pSource^;
  10.     Inc(pSource, SourceWidth);
  11.     Inc(Buff);
  12.   end;
  13. end;
  14.  
  15. procedure TglForm.textur;
  16. var
  17.   tex : PSDL_Surface;
  18.   buff: pByte;
  19. begin
  20.   glGenTextures(2, @TexID[1]);
  21.   glGenTextures(1, @blendID);
  22.  
  23.   glBindTexture(GL_TEXTURE_2D, TexID[1]);
  24.   tex := IMG_Load(Pchar('C:\pool.jpg'));
  25.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  26.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  27.   glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  28.   SDL_FreeSurface(tex);
  29.  
  30.   glBindTexture(GL_TEXTURE_2D, TexID[2]);
  31.   tex:= IMG_Load(Pchar('C:\glass04.jpg'));
  32.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  33.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  34.   glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  35.   SDL_FreeSurface(tex);
  36.  
  37.   glBindTexture(GL_TEXTURE_2D, BlendID);
  38.   Tex := IMG_Load('C:\blend.jpg');
  39.   GetMem(Buff, Tex^.w * Tex^.h);
  40.   RedToAlpha(Tex, Buff);
  41.  
  42.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  43.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  44.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  45.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  46.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Tex^.w, Tex^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Buff);
  47.   FreeMem(Buff);
  48.   SDL_FreeSurface(Tex);
  49. end;


Und RedToAlpha sieht evtl in meinem Code etwas anders aus, da ich solche Funktionen dann gerne als Unterfunktionen mache. Wenn sie sowieso nur an einer Stelle benutzt werden. Das würde dann so sein.
Code:
  1. procedure TglForm.textur;
  2.  
  3.   procedure RedToAlpha(Tex: PSDL_Surface; Buff: pByte);
  4.   begin
  5.     // hier irgendwas in RedToAlpha
  6.   end;
  7.  
  8. begin
  9.   // texture
  10.   RedToAlpha(...);
  11. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 28, 2007 16:29 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Vielen Vielen Dank für deine Hilfe!!!!!

Etz gehts, hast mir den Ar*** gerettet !!!!
Danke für deine Mühe und srry, für die blöden Fragen(wird wahrscheinlich net die letzte gewesen sein.... ;) )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 28, 2007 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bitte Bitte. Texturen in Not da kann ich nicht anders. ;)

Allerdings. Du solltest beim Starten deiner Anwendung aber auch noch überprüfen ob das alles auch unterstützt wird. Denn so könntest du dann sagen "nee ist nicht" und wüsstest warum es den Dienst verweigert als wie wenn es vollkommen verquere Dinge zeichnet. Was durchaus passieren kann.

Also GL_VERSION_1_3 (OpenGL Kern 1.3) sollte unterstützt werden und mindestens 3 Texturen sollten auch unterstützt werden. Man könnte zwar anstelle von GL_VERSION_1_3 auch die einzelnen Extensions (GL_ARB_multitexture und GL_ARB_texture_env_combine) überprüfen aber ich denke auf Grund des Alters ist das nicht nötig.

Nach dem Initialisieren und Erstellen von OpenGL.
Code:
  1. var
  2.   maxTMU: TGLint;
  3.  
  4.   if not GL_VERSION_1_3 then
  5.     // Kein OpenGL 1.3
  6.  
  7.   glGetIntegerv(GL_MAX_TEXTURE_UNITS, @maxTMUs);
  8.   if maxTMUs < 3 then
  9.     // keine 3 TMUs


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 15 Queries | GZIP : On ]