Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Texture nach vorne (https://www.delphipraxis.net/114323-texture-nach-vorne.html)

EWeiss 23. Mai 2008 12:03


Texture nach vorne
 
Hab gesucht nichts gefunden :(

Kennt jemand den Befehl wie ich eine Texture die verdeckt ist
beim click nach vorne bringen kann ?

gruss Emil

Medium 23. Mai 2008 12:35

Re: Texture nach vorne
 
Was für eine Texture? Der komplette Zusammenhang fehlt.

littleDave 23. Mai 2008 12:39

Re: Texture nach vorne
 
Ich geh mal davon aus, dass du OpenGL meinst ;-)
So ganz ersichtlich ist mir deine Frage nicht. Ich geh mal davon aus, dass das Polygon, dass du selektiert hast "StayOnTop" haben willst.
Dafür gibt es einen Trick: du musst den Tiefenpuffer temporär deaktivieren, so dass beim Zeichnen des Polygons der Tieferwert nicht beachtet und nicht geschrieben wird. Dafür gibt es einen einfachen Befehl.

Immer im Vordergrund:
Delphi-Quellcode:
// Depth-Buffer auf Read-Only setzen
glDepthMask(ByteBool(False));
// Depth-Buffer deaktivieren
glDisable(GL_DEPTH_TEST);


// Polygon Zeichnen
RenderQuad;


// und nun den Depth-Buffer reaktivieren
glEnable(GL_DEPTH_TEST);
glDepthMask(ByteBool(True));
Hoffe, du hast das gemeint.

EWeiss 23. Mai 2008 12:40

Re: Texture nach vorne
 
Zitat:

Zitat von Medium
Was für eine Texture? Der komplette Zusammenhang fehlt.

OpenGl Texture auf die ich klicke soll wenn verdeckt nach vorne gebracht werden.

gruss Emil

EWeiss 23. Mai 2008 12:50

Re: Texture nach vorne
 
@littleDave
Zitat:

Hoffe, du hast das gemeint.
Ja ;)

Deine abfrage http://www.delphipraxis.net/internal...=891363#891363
funktioniert gut hast nur nicht gesehen das der eigentliche Cover der ja auf dem Hintergrund
angezeigt wird nicht addiert werden darf .. muss also abgezogen werden.
Aber nicht tragisch will das sowieso ändern jetzt soll er addiert werden und zwar jedes was nachträglich abgespielt wird.

So kann man dann informationen des Albums abrufen und eventuell dann
einen anderen Titel abspielen wenn gewünscht.

Aber das mach ich schon ;)

gruss Emil

EWeiss 23. Mai 2008 13:15

Re: Texture nach vorne
 
Wieder ein positions problem

Befinde mich innerhalb der RenderAlbum

Delphi-Quellcode:
    if i = CurrentQuad then
    begin
      // Blendung einschalten
      glEnable(GL_BLEND);
      // Blend Funktion setzen
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      glColor4f(1, 1, 1, 0.7);
      // Texture nach vorne holen
      StayOnTop; //<<-----
      // Info Fenster anzeigen
      Win.IMGTexture := quadTexture[i];
      Win.bRenderGUI := True;
    end else
    begin
     // Original Farben setzen
     glColor4f(1, 1, 1, 1);
     // Blenden ausschalten
     glDisable(GL_BLEND);
    end;
würde ich jetzt

Delphi-Quellcode:
procedure StayOnTop;
begin
  // Depth-Buffer auf Read-Only setzen
  glDepthMask(ByteBool(False));
  // Depth-Buffer deaktivieren
  glDisable(GL_DEPTH_TEST);


  // Polygon Zeichnen , Quader funtion zum zeichen befindet sich hier
  RenderAlbum(QuadSpeed / 1000.0);


  // und nun den Depth-Buffer reaktivieren
  glEnable(GL_DEPTH_TEST);
  glDepthMask(ByteBool(True));
end;
aufrufen dann wäre das recursiv führt unweigerlich zum AV
Das ist eigentlich mein problem mit OpenGl da man manchmal nicht weiss
an welcher stelle man eine funktion ausführen soll ohne mit anderen zu kollidieren.

EDIT:
Habs mal umgestellt

Delphi-Quellcode:
StayOnTop(aPos, QuadSize);
Delphi-Quellcode:
procedure StayOnTop(aPos: TGLVectord3; QuadSize: single);
begin
  // Depth-Buffer auf Read-Only setzen
  glDepthMask(ByteBool(False));
  // Depth-Buffer deaktivieren
  glDisable(GL_DEPTH_TEST);

  // Quad zeichnen
  glBegin(GL_QUADS);
    glTexCoord2f(0, 1); glVertex3f(aPos[0] - QuadSize, aPos[1] + QuadSize*2, aPos[2]);
    glTexCoord2f(0, 0); glVertex3f(aPos[0] - QuadSize, aPos[1]            , aPos[2]);
    glTexCoord2f(1, 0); glVertex3f(aPos[0] + QuadSize, aPos[1]            , aPos[2]);
    glTexCoord2f(1, 1); glVertex3f(aPos[0] + QuadSize, aPos[1] + QuadSize*2, aPos[2]);
  glEnd();

  // und nun den Depth-Buffer reaktivieren
  glEnable(GL_DEPTH_TEST);
  glDepthMask(ByteBool(True));
end;
setzt sich aber nicht OnTop

gruss Emil

littleDave 23. Mai 2008 13:41

Re: Texture nach vorne
 
Hier:
Delphi-Quellcode:
procedure BeginStayOnTop;
begin
  // Depth-Buffer auf Read-Only setzen
  glDepthMask(ByteBool(False));
  // Depth-Buffer deaktivieren
  glDisable(GL_DEPTH_TEST);
end;

procedure EndStayOnTop;
begin
  // und nun den Depth-Buffer reaktivieren
  glEnable(GL_DEPTH_TEST);
  glDepthMask(ByteBool(True));
end;

{ .............. }

  if i = CurrentQuad then
  begin
    // Blendung einschalten
    glEnable(GL_BLEND);
    // Blend Funktion setzen
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(1, 1, 1, 0.7);
 
    // Hervorhebung aktivieren
    BeginStayOnTop;
 
    Win.IMGTexture := quadTexture[i];
    Win.bRenderGUI := True;
  end else
  begin
    // Original Farben setzen
    glColor4f(1, 1, 1, 1);
    // Blenden ausschalten
     glDisable(GL_BLEND);
  end;

  glBegin( // .... hier das Quad Rendern
  glEnd(); // das ende des Quad-Renderings

  // Hervorhebung wieder deaktivieren (falls es an war)
  if i = CurrentQuad then
     EndStayOnTop;
Edit: hab dein Edit nicht gesehen :oops:
Also der Code sollte eigentlich funktionieren. Ich weiß nicht, was du dir unter dem "StayOnTop" vorstellt: Der Code ist nur dafür da, um den Tiefentest zu deaktivieren. Wenn du jetzt das Quad noch größer machen willst, musst du das schon von Hand machen.

EWeiss 23. Mai 2008 14:02

Re: Texture nach vorne
 
Danke habe es genau nach deiner anweisung gemacht funktioniert nicht.
Da kommt sich irgendwas in die quere.
Sieht aus als wenn sich das mit dem quader nicht verträgt auf dem die spiegelung ausgeführt wird.

Delphi-Quellcode:
procedure BeginStayOnTop;
begin
  // Depth-Buffer auf Read-Only setzen
  glDepthMask(ByteBool(False));
  // Depth-Buffer deaktivieren
  glDisable(GL_DEPTH_TEST);
end;


procedure EndStayOnTop;
begin
  // und nun den Depth-Buffer reaktivieren
  glEnable(GL_DEPTH_TEST);
  glDepthMask(ByteBool(True));
end;


procedure RenderAlbum(aDeltaTime: single);

const
  QuadSize = 1.5; // die Größe der Quader

  // Diese Funktion zeichnet die Quader. ColorScale skaliert dabei die Farbwerte der oberen beiden Ecken
  procedure DrawQuads();
  var i        : integer;    // index der for-schleife
      QuadAngle : single;     // die Rotation des aktuellen Quads
      aPos     : TGLVectord3; // die finale Position des aktuellen Quads [aPos = array[0..2] of single]
  begin

  glEnable(GL_TEXTURE_2D);

  glInitNames;
  glPushName(0);

  // alle Quads durchgehen
  for i := 0 to QuadCount - 1 do
  begin

    // Position initialisieren (aPos[0] = 0, aPos[1] = 0, aPos[2] = 10)
    aPos := Vector_Make3f(0, 0, 12);

    // Die Rotation des Quads (um den Mittelpunkt des Kreises, der durch die Quads gebildet wird)
    // + ListAnge, also die Rotation, die mit der Maus gemacht wird
    QuadAngle := DegToRad( 360 / (QuadCount) * i) + ListAngle;

    // Den Positionvektor um den Mittelpunkt des Kreises um die Y-Achse rotieren
    aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False);

    glBindTexture(GL_TEXTURE_2D, quadTexture[i]);

    if i = CurrentQuad then
    begin
      // Jetzt brauchen wir Blending
      glEnable(GL_BLEND);
      // nun die Blending-Funktion setzen
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      glColor4f(1, 1, 1, 0.7);
      BeginStayOnTop;
      Win.IMGTexture := quadTexture[i];
      Win.bRenderGUI := True;
    end else
    begin
     // Original Farben setzen
     glColor4f(1, 1, 1, 1);
     // Blenden ausschalten
     glDisable(GL_BLEND);
    end;

    // Quad zeichnen
    glBegin(GL_QUADS);
      glTexCoord2f(0, 1); glVertex3f(aPos[0] - QuadSize, aPos[1] + QuadSize*2, aPos[2]);
      glTexCoord2f(0, 0); glVertex3f(aPos[0] - QuadSize, aPos[1]            , aPos[2]);
      glTexCoord2f(1, 0); glVertex3f(aPos[0] + QuadSize, aPos[1]            , aPos[2]);
      glTexCoord2f(1, 1); glVertex3f(aPos[0] + QuadSize, aPos[1] + QuadSize*2, aPos[2]);
    glEnd();

    if i = CurrentQuad then
     EndStayOnTop;

    QuadName[i] := IntToStr(i + 1);
    glLoadName(i + 1);
  end;
  glPopName;

end;
muss mal schaun was da jetzt wieder querschießt. :)

PS: Das mit dem Speicher funktioniert jetzt ordnungsgemäß
Du hattest recht habe die Texturen doppelt eingeladen... :wall:
Macht sich schon beim start bemerkbar dauert nicht mehr so lange bis die Vis aktiviert ist.

EDIT:
Hmm jo hab mich schon gewundert das es nicht gehen soll..
Ich habe ja den Coverkreis in dem die Texturen hintereinander angeordnet werden
Ich wollte nichts anderes die Texture welche von einer anderen verdeckt wird nachvorne holen
Nicht vergrößern..

EDIT2
Jetzt gehts allerdings nur die rechte seite .. das sollte reichen
Danke

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz