Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 07, 2025 11:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Mär 02, 2007 18:53 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

wahrscheinlich ist das jetzt eine dämliche Frage, aber ich habe mir die ersten 3 Kapitel in Wiki durchgelesen und hier im Forum gesucht,
und nix gefunden, bzw. es war mir (noch) zu komplex.

Also ich zeichne wie in Tutorial_Quickstart gezeigt ein Viereck (http://wiki.delphigl.com/index.php/Tutorial_Quickstart)
Funktioniert auch super.

Mit
Code:
  1.  
  2. glTranslatef(-15,0,0);
  3.  

kann ich das Viereck bewegen.

Mein Problem, wie kann ich dieses Objekt Pixelweiße verschieben???

Wie stell ich es an das der Ursprung links oben in der Ecke ist und ich mit
Code:
  1.  
  2. glTranslatef(15,0,0);
  3.  

das Objekt um 15 Pixel nach rechts verschiebe?


Oder habe ich hier was Grundlegensdes nicht verstanden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 02, 2007 19:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
15 Pixel? Was hast du damit vor? Möchtest du etwas in 2D oder in 3D darstellen? Pixel sind für so das typische Zeichen für 2D.

Normal sind die Angaben Einheiten in OpenGL und diese sind reine Auslegungssache. Je nach Tiefe ist 1 weniger als wie wenn es weiter vorn stehen würde. Oder wenn die Perspektive anders eingestellt ist.

Wenn du 2D machen möchtest dann solltest du dir demnächst dieses Tutorial durchlehen. Nichts desto trotz befinden sich in Tutorial 1-3 noch Grundwissen was nie schaden kann.

In 2D ist es Problemlos möglich deine Elemente Pixelgenau zu positionieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 02, 2007 20:44 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Danke

Ich werde mir das Tutorial mal durchlesen.

Ja ich möchte mal mit 2D beginnen.
Einfach mal in OpenGL reinschnuppern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 22:08 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,


Ich habe das Tutuorial jetzt schon fast durchgearbeitet, und es ist einfach SUPER.


Alles funktioniert so wie ich es will,
allerdings tritt ein "Fehler" auf den ich nicht verstehe.


Sobald ich eine Texture lade - nur lade, nix damit anfange - bleibt der Bildschirm schwarz.....

Ich habe das ganze Projekt in den Anhang gegeben,
wenn ich diese Zeile ausklammer

Code:
  1.  
  2. LoadTexture('test.tga', Textur_Nr);
  3.  


funktioniert alles, wenn ich sie stehen lasse bleibt der Bildschirm schwarz.

WARUM??


Im Anhang ist das gesamte Projekt.

Hier der Quellcode




Code:
  1.  
  2. unit MainUnit;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Forms, dglOpenGL, Textures, Classes, ExtCtrls, SysUtils;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     OpenGlTimer: TTimer;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormDestroy(Sender: TObject);
  14.     procedure Render(Sender: TOBject);
  15.     procedure FormResize(Sender: TObject);
  16.   end;
  17.  
  18. var
  19.   MainForm: TMainForm;
  20.  
  21.   // OpenGL
  22.   DC : HDC;
  23.   RC : HGLRC;
  24.  
  25.   // Test
  26.   Textur_Nr: glUInt;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.                                                                                 ////////////
  32.                                                                                 // CREATE //
  33.                                                                                 ////////////
  34. procedure TMainForm.FormCreate(Sender: TObject);
  35. begin
  36.   DC:= GetDC(Handle);
  37.   RC:= CreateRenderingContext( DC,[opDoubleBuffered],32,24,0,0,0,0);
  38.   ActivateRenderingContext(DC, RC);
  39.   glEnable(GL_DEPTH_TEST); // Tiefentest
  40.   glEnable(GL_CULL_FACE);   // nur vorderseite zeichnen (gegen urzeigersinn)
  41.   glEnable(GL_TEXTURE_2D);
  42.  
  43.  
  44.   // Lade Textur
  45.   //Wenn ich diese Zeille ausklammer, dann funktioniert alles,
  46.   // wenn nicht, bleibt der Bildschirm schwarz, WARUM???
  47.  
  48.   LoadTexture('test.tga', Textur_Nr);
  49.  
  50.  
  51.   Render(NIL);
  52. end;
  53.  
  54.  
  55. procedure TMainForm.Render(Sender: TOBject);
  56. begin
  57.   // Lösche Altes Bild
  58.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  59.  
  60.   glMatrixMode(GL_PROJECTION);
  61.   glLoadIdentity;
  62.   glViewport(0,0,ClientWidth,ClientHeight);
  63.   glOrtho(0,800,600,0,0,128);
  64.  
  65.   // Hintergrund
  66.  
  67.    glBegin(GL_QUADS);
  68.     glColor3f(1, 0, 1); glVertex3f(0, 0, -1);
  69.     glColor3f(1, 0, 0); glVertex3f(0, 600, -1);
  70.     glColor3f(1, 0, 0); glVertex3f(800, 600, -1);
  71.     glColor3f(1, 0, 1); glVertex3f(800, 0, -1);
  72.  
  73.     glColor3f(0.5, 0, 0.1); glVertex2f(50, 50);
  74.     glColor3f(1, 1, 1);   glVertex2f(50, 550);
  75.     glColor3f(0.5, 0, 0.1); glVertex2f(750, 550);
  76.     glColor3f(1, 0, 1);   glVertex2f(750, 50);
  77.   glEnd;
  78.  
  79.   SwapBuffers(DC);
  80. end;
  81.                                                                                 ////////////
  82.                                                                                 // RESIZE //
  83.                                                                                 ////////////
  84. procedure TMainForm.FormResize(Sender: TObject);
  85. begin
  86.   glViewport(0, 0, ClientWidth, ClientHeight);
  87.   glMatrixMode(GL_PROJECTION);
  88.   glLoadIdentity;
  89.   gluPerspective(50, ClientWidth/ClientHeight, 1, 1000);
  90.  
  91.   glMatrixMode(GL_MODELVIEW);
  92.   glLoadIdentity;
  93. end;                                                                            /////////////
  94.                                                                                 // DESTROY //
  95.                                                                                 /////////////
  96. procedure TMainForm.FormDestroy(Sender: TObject);
  97. begin
  98.   DeactivateRenderingContext;
  99.   DestroyRenderingContext(RC);
  100.   ReleaseDC(Handle, DC);
  101. end;
  102.  
  103.  
  104.  
  105. end.
  106.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 22:15 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du hast Texturen aktiviert, aber standartmässig eine weiße (nil) Textur aktiv. Sobald du aber eine Textur lädst ist diese gesetzt.
glBindTexture(GL_TEXTURE_2D, 0) setzt die default zurück oder glDisable(GL_TEXTURE_2D).

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 22:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ist die Textur in den Ecken Schwarz? Wenn du Texturen benutzt dann musst du auch Texturkoordinaten benutzen, da OpenGL sonst nicht weiß wie er die Texturen darstellen soll. Jedes Vertex benötigt eine Koordinate. Setzen kannst du diese mit glTexCoord und die sind normal im Bereich zwischen 0 und 1. Bei den Koordinaten entspricht S = X und T = Y. Ach ja. Und du musst sie vor glVertex setzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 05, 2007 07:43 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Ich glaub ihr versteht mein Probmlem nicht.


Aber mein Problem ist NICHT, das ich die Textur nicht sehe, sondern das ich die zwei Quads nicht mehr sehe, sobald ich eine Textur lade.

Ich weiß das ich glBindTexture(GL_TEXTURE_2D, 0) und glTexCoord noch brauche, allerdings tritt ja schon vorher der Fehler auf,
das ich überhaupt nichts mehr auf den Bildschirm bekomme, auch keine normale Quads mehr, sobald ich nur

LoadTexture('test.tga', Textur_Nr);

aufrufe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 05, 2007 08:42 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
LoadTexture ruft schon glBindTexture auf.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 05, 2007 08:55 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Also ich habe jetzt herumprobiert und wenn ich


Zitat:
LoadTexture('test.tga', Textur_Nr);
glBindTexture(GL_TEXTURE_2D, 0);



die Zeile noch einbau dann gehts.

Aber das Verhalten versteh ich nicht....
Warum werden die zwei Quads nicht gezeichnet, wenn eine Textur "gebunden" ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 05, 2007 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ferby. Lass es mich anders sagen. Was macht dich so sicher, dass es ein Fehler ist? Und nicht nur eine unglückliche Farbkombination die dafür sorgt, dass deine Anwendung versucht die Ostfriesische Nationalflagge nachzueifern. Weißer Adler auf weißem Grund.

Wenn du keine Textur hast, dann benutzt er die Farbe der Fläche (weiß). Wenn du aber eine hast wird die Farbe mit des Texels (Pixel der Textur) mit dem der Fläche verrechnet. Wenn das Pixel gerade schwarz ist dann ergibt 1 * 0 nun mal 0. Und bei typischerweise einem schwarzen Hintergrund ist deine Fläche nicht weg. Sie hat sich nur perfekt getarnt. Und dadurch, dass du keine Texturkoordinaten hast wird das Pixel an der Stelle 0, 0 über die gesammte Fläche gespannt. Und nach dem Laden sind sie schon gebunden und aktiv.

Wie i0n0s schon mal gesagt hat. Rufe einmal "glDisable(GL_TEXTURE_2D)" vor dem zeichnen deiner Flächen auf und du wirst sehen, dass sie wie aus Zauberhand wieder da sind. glBindTexture mit 0 hat in etwa den gleichen Effekt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 05, 2007 11:39 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Vielen dank, jetzt versteh ich das Verhalten.

Das erste Pixel ist wirklich schwarz.
Wenn das erste Pixel eine andere Farbe hat, dann wird es wirklich "gemischt" gezeichnet, so wie du gesagt hast.

Super das mir hier so gut geholfen wird :-)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]