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
OpenGl , wie macht man ein Loch in eine Fläche ?
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
OpenGl , wie macht man ein Loch in eine Fläche ?
www.flz-vortex.de
-
- 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 ?
Textur-Farbe Alpha - Channel ?
-Michael
-Michael
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- 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 ?
hier wird das im Prinzip auch gemacht.
Zusätzlich brauchst du dglOpenGL.pas (ist meines erachtens besser als gl und glu)
Zusätzlich brauchst du dglOpenGL.pas (ist meines erachtens besser als gl und glu)
--
Just try it
Just try it
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
Re: OpenGl , wie macht man ein Loch in eine Fläche ?
Hallo,
danke für die Tipps , ich probier damit mal herum.
Gruß
Frank
danke für die Tipps , ich probier damit mal herum.
Gruß
Frank
www.flz-vortex.de
-
- Beiträge: 6207
- 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 ?
Hast du so was gemeint ?Ich möchte ein Fläche zeichnen , z.B. mit (gl_Quads) komplett in Rot und dort soll ein Loch rein.
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
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.
Gruß
Frank
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
-
- Beiträge: 6207
- 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 ?
Normalerweise funktioniert dies, ausser du hast ein uraltes OpenGL < 1.3.Hatte anfangs ein paar Probleme mit der Zeichenroutine , bis ich gemerkt habe , das Laz beim Befehl glActiveTexture(GL_TEXTURE0)
ausgestiegen ist .
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
Mit Java und C/C++ sehe ich rot