Autor Beitrag
Fireblade
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 23.01.05 06:13 
Ich kenne mich noch nicht sonderlich gut mit OpenGL aus und habe folgende Frage:

Ich habe eine Textur in einer 128x128x3 Byte großen R-G-B RAW File und lade sie in etwa per:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var data: Pointer; 
    texture: array[0..0] of GLuint;
...
  GetMem(data, fileLength);
...
  FileRead(fileHandle, data, 16384);
...

Also liegen die nackten Daten im Speicher referenziert durch "data".

Kann ich damit nicht per
ausblenden Delphi-Quelltext
1:
2:
3:
  glGenTextures(1, texture[0]);
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

eine Textur draus erstellen? Ich bin ratlos, wo der Fehler gerade liegt.

Mein Polygon sehe ich, aber ich sehe keine Textur darauf. Was mache ich falsch?

Ach ja.. ich habe auch daran gedacht im Init Teil meiner OpenGL Anwendung das glEnable(GL_TEXTURE_2D); zu setzen.
Vor dem glBegin habe ich glBindTexture(GL_TEXTURE_2D, texture[0])
Im glBegin(GL_QUADS); Block steht auch glColor3f(1,1,1); (damit nicht alles Schwarz ist)

Wenn ich OpenGl richtig verstehe handelt es sich
um einen - sehr Fachinformatisch ausgedrückt - "Zustandsautomat". Das heisst, wenn ich diese Direktive gesetzt habe ist der Modus an, egal in welcher Prozedur ich das in Delphi mache oder?

Es kann auch sein dass ich am Konzept der Texturen etwas nicht verstehe.
Vielleicht kann mir ja noch jemand in 2-3 Sätzen das zusammenspiel der Befehle glGenTextures/glBindTexture/glTexImage2D erklären.
Ich habe jetzt eine Menge Tutorials gelesen, aber wirklich gut raus kam es nirgends.

Ich würde mich über Hilfe sehr freuen, möchte aber nicht unbeding "diese oder jene" Unit laden die das für mich macht, sondern gerne selbst verstehe warum und wie. Deshalb auch die Raw Datei. Wenn alles läuft werde ich mir auch mal eine BMP Routine bauen... :)

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: So 23.01.05 08:24 
hi fireblade,

ich kenn mich selber mit opengl nicht so gut aus, aber ich glaube ich weiß, wo dein problem ist. guck dir mal folgende deiner zeilen genau:

ausblenden Delphi-Quelltext
1:
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, data);					


fällt dir was auf? nein, ok, ich sag dir, was falsch ist!
du musst @data und nicht data schreiben!
also so:

ausblenden Delphi-Quelltext
1:
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, @data);					


Das müsste eigentlich richtig sein, ....

MfG, Scorpion!

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.

_________________
Aus dem Urlaub zurück!
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: So 23.01.05 10:26 
@ßcropien: Nicht 100% korrekt, es kommt ne wenig auf die Header an. Also am besten einmal selbst schaun, ob ein Pointer oder eine Variable erwartet wird, gleiches gilt auch für glBindTexture. Einen Fehler beim groben überfliegen sehe ich nicht... also schlage ich Dir mal vor (*g*) z.B. Jan Horns Texture-Loader zu verwenden (oder irgend einen anderen) und auszutesten, ob Du dann etwas siehst. Damit könnte man das Problem schonmal ungemeint einschränken. Ich selbst mache gerade nach längerer Abwesendheit auch häufig einen Fehler und frage daher. Wird bei dem Objekt auch mit glTexCoord2f die Textur-Koordinaten gesetzt? Sind diese nicht gesetzt, kann es so wirken als sei keine gesetzt. Gerade wenn es sich um eine dunkle handelt (nimm ne helle, man sollte er "verfärbung" erkennen. Wenn dort nichts erfolgt, müssen wir uns nochmal mit deinem Loader auseinander setzen. ;)
@state machine: Yep, dass ist korrekt. Stell Dir die Pipeline wie eine Reihe dümmlicher Praktikanten die Du an ein Fließband stellst. Der erste bekommt ne Hammer, der zweite ne Flammenwerfer. Jagst Du dann ne Stück Fleisch drüber, haut der erste druff, und der zweite röstet es. Datt machen die so lange bis Du ihnen was anderes sagst (oder Mittagspause ist). Setzt Du also nach dem Init glEnable(GL_TEXTURE2D) so hat es solange gültigkeit bis der RC neu initialisiert wird (meist ja eher nicht...) oder Du es mit glDisable wiederrufst.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: So 23.01.05 10:49 
aber im allgemeinen müsste das mit dem pointer gehen, oder?
also ich hatte mal einen opengl-source und da war glaube ich auch ein pointer, wenn ich mich nicht täusche.

aber was reden wir so lange: klappt es denn (@Fireblade)

_________________
Aus dem Urlaub zurück!
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: So 23.01.05 11:20 
Wie gesagt, kommt auf die verwendeten Header an. Man kann durchaus beides finden. Deswegen eben direkt in den Headern schaun, was wirklich drinne steht, den nur das zählt auch ;)

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 23.01.05 11:45 
bei glBegin(GL_QUADS) musst du auch glTexCoord2f / 3f entsprechend aufrufen (also bei nem viereck auf 4 mal wenn 2D hast etwa so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
glBegin(GL_QUADS);
  glVertex2f(0,0);
  glTexCoord2f(0,0);
  glVertex2f(1,0);
  glTexCoord2f(1,0);
  glVertex2f(1,1);
  glTexCoord2f(1,1);
  glVertex2f(0,1);
  glTexCoord2f(0,1);
glEnd;



ansonsten sehe ich keinen fehler


btw wenn du
data: pointer

hast


muss der aufruf ohne @ stattfinden da ogl den pointer zu einem speicherbereich bekommt wo die daten liegen

ein @data übergibt ogl wo nen pointer ist wo dann din steht wo die daten liegen
es ist da egal was du für nen header hast das macht beim aufruf nichts
was genau data ist ist wichtig

also wenn data = pointer dann ohne @
wenn data = array[xx..xx] of byte dann muss man @ benutzen
da ogl immer den direkten pointer zu den daten haben will
Fireblade Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 23.01.05 18:36 
Hey, danke für die vielen Beiträge.
Leider hat alles nichts geholfen, ich glaube langsam auch, dass es was mit der korrekten Pointer Nutzung zu tun haben könnte - oder ich nutze die 3 "Textur-Erstellungs-Befehle" falsch; je nachdem ob ich jetzt ein @voranstelle erhalte ich eine access violation einmal im Speicherbereich 108A4000 und einmal um die 00131000.
Leider bin ich nicht so'n crack, der weiss was realistische Werte sind.

Ich bin mal so frei und poste alles relevante, vielleicht sieht ja doch noch jemand was:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
  ...
  texture: array[0..0] of GLuint;
  ...
  procedure glGenTextures(n: integer; var textures: GLuint); stdcall; external opengl32;
  procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

function LoadRAW(filename:String):Pointer;
var fileHandle : Integer;
    fileLength : Integer;
    data : Pointer;
begin
  fileHandle := FileOpen(filename, fmOpenRead);
  fileLength := FileSeek(fileHandle, 0, 2);
  GetMem(data, fileLength);
  FileSeek(fileHandle, 0, 0);
  FileRead(fileHandle, data, fileLength);
  FileClose(fileHandle);
  result := data;
end;

function loadTextures():boolean;
var tmp:Pointer;
begin
  tmp := LoadRAW('test.raw');
  glGenTextures(1, texture[0]); // Create The Texture
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, tmp);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  result := true;
end;

...
function DrawGLScene():boolean;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);     // Farb und Tiefenbuffer löschen
  glLoadIdentity();                                     // Einheitsmatrix laden

        glTranslatef(0.0,0.0,-5.0);
  glRotatef(xrot,1.0,0.0,0.0);            // Rotate On The X Axis
  glRotatef(yrot,0.0,1.0,0.0);            // Rotate On The Y Axis
  glRotatef(zrot,0.0,0.0,1.0);            // Rotate On The Z Axis

  glBindTexture(GL_TEXTURE_2D, texture[0]);

  glBegin(GL_QUADS);

                glColor3f(1,1,1.0);
    // Front Face
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);  // Bottom Left Of The Texture and Quad
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);  // Bottom Right Of The Texture and Quad
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);  // Top Right Of The Texture and Quad
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);  // Top Left Of The Texture and Quad
    // Back Face
...
...


Die UV-Koordinaten Geschichte ist ausm Nehe-Tutorial 5 gerippt... sollte also wirklich an der Textur Laden/in OpenGL Textur wandeln Sache scheitern.
Kann mir jemand erklären wie denn die State Machine Sache abläuft?
Ich besorge die Rohdaten leg sie in den Speicher und OpenGl wird drauf angesetzt und bastelt sich eine Textur draus,.. aber was bedeuten denn die
glGenTextures(1, texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
genau? Hat da jemand Durchblick?
Ich verstehe nicht ganz wie der "Texturename" texture[0]:GLuint da reinpasst...
Das ist ja irgendwie ein Integer als Knnungshandle.. in etwa wie ein FileHandle:integer
der eine File repräsentiert oder so...

Meinem Gefühl nach - also ohne jegliches Wissen - denke ich, dass ich den Pointer ohne @ weitergeben muss - er ist ja als Pointer deklariert. Setze ich ein @ davor zeige ich nicht mehr auf die Daten sondern gebe die Adresse des Pointers weiter und das interessiert ja OpenGL nicht oder?

na denn... freu mich über Anregungen :)

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
Fireblade Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 23.01.05 19:25 
Oh Mädels :)
es *WAR* ein Pointer Problem, allerdings an eine komplett anderen Stelle :):):)

FileRead(fileHandle, data^, fileLength);
statt
FileRead(fileHandle, data, fileLength);

:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:

Hey,... euch allen aber vielen Dank für die vielen Antworten, das macht Mut wenns mal gar nicht weitergeht...