Texturen OpenGL
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Texturen OpenGL
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Texturen OpenGL
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
Mit Java und C/C++ sehe ich rot
-
- 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
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...
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...
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...
Re: Texturen OpenGL
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
//...
-
- 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
Teekeks hat geschrieben:MAC hat geschrieben:Code: Alles auswählen
if LoadTexture('D:/...',texID) = True then
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?
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Texturen OpenGL
Diese Zeilen kommen normalerweise in ein Resize-Ereignis.
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.
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
Mit Java und C/C++ sehe ich rot