OpenGl , wie macht man ein Loch in eine Fläche ?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von Frank Ranis »

Hallo ,

brauche mal nen Tipp.

Ich möchte ein Fläche zeichnen , z.B. mit (gl_Quads) komplett in Rot und dort soll ein Loch rein.
Durch das Loch sollen eventuell hinter der Fläche liegende Objekte sichtbar sein , also komplett durchsichtig.
Die Fläche soll von allen Seiten sichbar sein .
Gibt es eventuell eine Möglichkeit mit Blending .

Es sollen nur die Standard-Units Gl , Glu und OpenGLControl als Ausgabekomponente verwendet werden.

Gruß

Frank
www.flz-vortex.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von mschnell »

Textur-Farbe Alpha - Channel ?
-Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von corpsman »

hier wird das im Prinzip auch gemacht.

Zusätzlich brauchst du dglOpenGL.pas (ist meines erachtens besser als gl und glu)
--
Just try it

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von Frank Ranis »

Hallo,

danke für die Tipps , ich probier damit mal herum.

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von Mathias »

Ich möchte ein Fläche zeichnen , z.B. mit (gl_Quads) komplett in Rot und dort soll ein Loch rein.
Hast du so was gemeint ?
http://mathias1000.bplaced.net/test/Texturen_Alpha_mit_Loch.tar.gz

Oder meinst du eine richtige Fläche aus mehreren Polygonen ?

Zusätzlich brauchst du dglOpenGL.pas (ist meines erachtens besser als gl und glu)

Die würde ich auf jeden Fall nehmen, die anderen Units sind veraltet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von Frank Ranis »

Hallo Mathias,

auch dir vielen Dank für den Democode.

Hatte anfangs ein paar Probleme mit der Zeichenroutine , bis ich gemerkt habe , das Laz beim Befehl glActiveTexture(GL_TEXTURE0)
ausgestiegen ist .

Hier der Qelltext , der bei mir auch läuft , verwendete dglOpenGL-Version V4.5.

Code: Alles auswählen

unit unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, StdCtrls, ComCtrls, OpenGLContext,dglOpenGL;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
  public
   OpenGLControl:TOpenGLControl;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
const
  size = 512;
var
  zdiff:double= 0.25;
 
var
  textureID0: GLuint;
  winkel: single;
  z:double=-3;
  Textur: array[0..size - 1, 0..size - 1, 0..3] of byte;
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 // Drehwinkel und Tiefenposition z einstellen
 winkel := winkel + 1;
 if winkel >= 360
  then
   begin
    winkel:=0;
   end;
 if (z<-10) or (z>-3) then zdiff:=-zdiff;
 caption:='z= '+floattostr(z);
 z:=z+zdiff;
 
 // Szene zeichnen
 glClearColor(0.5, 0.5, 0.5, 1.0);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glEnable(GL_DEPTH_TEST);
 
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45.0, OpenGLControl.width/OpenGLControl.height, 0.1, 100.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gltranslatef(0,0,z);
 glRotatef(winkel, 0, 1, 1);
 
 // --- Textur Aktivieren
 // Beim Befehl glActiveTexture(GL_TEXTURE0) ballert es ,
 // eventuell liegt es am dglOpenGL V4.5 was ich verwendet habe ,
 // aber geht wohl auch ohne
 // glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D, textureID0);
 glEnable(GL_TEXTURE_2D);
 glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0);
  glVertex3f(-0.8, -0.8, 0);
  glTexCoord2f(1.0, 0.0);
  glVertex3f(-0.8, 0.8, 0);
  glTexCoord2f(1.0, 1.0);
  glVertex3f(0.8, 0.8, 0);
  glTexCoord2f(0.0, 1.0);
  glVertex3f(0.8, -0.8, 0);
 glEnd();
 
 OpenGLControl.SwapBuffers;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  x, y, x2,y2: integer;
begin
 OpenGLControl := TOpenGLControl.Create(Self);
 with OpenGLControl do begin
   Parent := Self;
   Align := alClient;
   AutoResizeViewport := True;
 end;
 
 InitOpenGL;
 OpenGLControl.MakeCurrent;
 ReadExtensions;
 ReadImplementationProperties;
 
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 glEnable(GL_DEPTH_TEST);
 glDepthFunc(GL_LESS);
 
 // ---- Textur erzeugen ----
 // Eine Quadrat-Textur mit Loch drinn
 
 for x := 0 to size - 1 do begin
   for y := 0 to size - 1 do begin
     Textur[x, y, 0] := $00; // Blau
     Textur[x, y, 1] := $BF; // Grün
     Textur[x, y, 2] := $FF; // Rot
 
     x2 :=x-size div 2;
     y2 :=y-size div 2;
     if sqrt(x2 * x2 + y2 * y2) > size div 4
      then
       begin
       Textur[x, y, 3] := $FF; // Alfa 1 , für die sichbaren Texturanteile
       end
      else
       begin
        Textur[x, y, 3] := $00; // Alfa 0 , für das Loch
       end;
    end;
  end;
 
  // ------------ Texturen laden --------------
  glGenTextures(1, @textureID0);
  glBindTexture(GL_TEXTURE_2D, textureID0);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_BGRA, GL_UNSIGNED_BYTE, @Textur);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  glDeleteTextures(1, @textureID0);
end;
 
initialization
 
  {$I unit1.lrs}
 
end.   


Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Beitrag von Mathias »

Hatte anfangs ein paar Probleme mit der Zeichenroutine , bis ich gemerkt habe , das Laz beim Befehl glActiveTexture(GL_TEXTURE0)
ausgestiegen ist .
Normalerweise funktioniert dies, ausser du hast ein uraltes OpenGL < 1.3.

Aber wen man kein Multitexturing hat, wie in diesem einfachen Beispiel, kann es weggelassen werden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten