Texturen OpenGL

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Texturen OpenGL

Beitrag von SoE »


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

Re: Texturen OpenGL

Beitrag von Mathias »

und bisher keine Texturen unter Lazarus in Opengl bekomme


Ich hoffe mit diesem kleine Beispiel kann ich dir helfen.

Code: Alles auswählen

unit unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, OpenGLContext, dglOpenGL;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Image1: TImage;
    OpenGLControl1: TOpenGLControl;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
var
  textureID0: GLuint;
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0.8, 0.5, 0.3, 1.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
 
  // --- Textur Aktivieren
 
  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, textureID0);
 
  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();
 
 
  OpenGLControl1.SwapBuffers;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  InitOpenGL;
  OpenGLControl1.MakeCurrent;
  ReadExtensions;
  ReadImplementationProperties;
 
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);
 
 
  // ------------ Texturen laden --------------
 
  with Image1.Picture.Bitmap do begin
    glGenTextures(1, @textureID0);
    glBindTexture(GL_TEXTURE_2D, textureID0);
 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Image1.Picture.Bitmap.RawImage.Data);
 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glGenerateMipmap(GL_TEXTURE_2D);
  end;
 
  glEnable(GL_TEXTURE_2D);
end;
 
initialization
 
  {$I unit1.lrs}
 
end.
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Texturen OpenGL

Beitrag von Mathias »

Hier eine funktionierende Demo mit einer drehenden Textur.
Dateianhänge
Texturen.zip
(197.19 KiB) 106-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Texturen OpenGL

Beitrag von Hartkern »

Hallo Mathias.

nachdem ich dein Texturenbeispiel ordentlich umgebaut hab und endlich dahintergestiegen bin wie ich auch mehrere Texturen verwalte etc.brennt mir noch eines auf den Nägeln.

Ich kann mit deinem Beispielprogramm keine Tiefe des beklebten Objektes verwirklichen...

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_Projection);
  glViewport(0,0,ClientWidth,ClientHeight);
  glLoadIdentity();
 
  glTranslatef(StartX,0.0,Zoom);
 
  //1. Reihe
  DrawMap(0.0,0.0,0.0);           //X:=X-0.25  Y:=Y-0.25
  DrawMap(-0.5,-0.5,0);
  DrawMap(-1.0,-1.0,0);               


wenn ich dann per Tastendruck die Variable Zoom beeinflusse, passiert erstmal nix und dann verschwindet die Textur komplett, oder erscheint. jedoch kommt keine Tiefe zustande... :?:

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Texturen OpenGL

Beitrag von wp_xyz »

Ich wollte das bei deinem anderen OpenGL-Post schon schreiben: Bring zuerst mal die Matrizen in Ordnung. Es gibt zwei Matrizen in OpenGL, GL_PROJECTION und GL_MODELVIEW. Dein Code initialisiert nur die Projektions-Matrix, aber die ModelView-matrix wird ignoriert. Keine Ahnung, ob das deinen Fehler verursacht, aber die nicht-initialisierte Matrix erscheint mir schon sehr verdächtig.

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_Projection);
  glViewport(0,0,ClientWidth,ClientHeight);
  glLoadIdentity();
 
  glMatrixMode(GL_MODELVIEW);   // <-- fehlt
  glLoadIdentity();             // <-- fehlt
 
  glTranslatef(StartX,0.0,Zoom);
 
  //1. Reihe
  //...

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Texturen OpenGL

Beitrag von Euklid »

Teekeks hat geschrieben:
MAC hat geschrieben:

Code: Alles auswählen

if LoadTexture('D:/...',texID) = True then

:shock: Warum vergleichst du auf true? das result ist doch schon Boolean.

Das kann durchaus auch mal schief gehen (auch der Vergleich auf false)


Weshalb kann das schief gehen? Ist das nicht reine Geschmackssache?

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

Re: Texturen OpenGL

Beitrag von Mathias »

Diese Zeilen kommen normalerweise in ein Resize-Ereignis.

Code: Alles auswählen

 glMatrixMode(GL_Projection);
  glViewport(0,0,ClientWidth,ClientHeight);
  glLoadIdentity();


Das sieht meine Textur-Demo so aus, wie im Anhang.
Da sieht man auch, für was die Projections-Matrix gut ist.
Ich habe dafür die Alpha-Blending deaktiviert, das man es besser sieht.
Dateianhänge
Texturen.zip
(6.83 MiB) 94-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten