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

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

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

Beitragvon Frank Ranis » 15. Feb 2018, 08:57 OpenGl , wie macht man ein Loch in eine Fläche ?

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
Frank Ranis
 
Beiträge: 111
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon mschnell » 15. Feb 2018, 12:02 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Textur-Farbe Alpha - Channel ?
-Michael
mschnell
 
Beiträge: 3221
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon corpsman » 15. Feb 2018, 13:31 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

hier wird das im Prinzip auch gemacht.

Zusätzlich brauchst du dglOpenGL.pas (ist meines erachtens besser als gl und glu)
--
Just try it
corpsman
 
Beiträge: 1043
Registriert: 28. Feb 2009, 08:54
Wohnort: Stuttgart
OS, Lazarus, FPC: Kubuntu 14.04, Lazarus SVN Trunk, FPC 3.0 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Frank Ranis » 15. Feb 2018, 13:49 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

Hallo,

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

Gruß

Frank
www.flz-vortex.de
Frank Ranis
 
Beiträge: 111
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 15. Feb 2018, 18:28 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4250
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Frank Ranis » 16. Feb 2018, 10:29 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

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
Frank Ranis
 
Beiträge: 111
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 16. Feb 2018, 18:27 Re: OpenGl , wie macht man ein Loch in eine Fläche ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4250
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
porpoises-institution
accuracy-worried