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

Aktuelle Zeit: Fr Mär 29, 2024 09:45

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glCopyTexImage2D
BeitragVerfasst: Sa Mär 07, 2015 19:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Was ist mein Überlegunsfehler ?

Bei folgen Code wird ein Dreieck in eine Textur gerendert.
Welche auch funktioniert.
Da ich ich mit glViewport die Koordinaten halbiere, erscheint das Dreieck in einer Ecke einer Würfelfläche.
Code:
  1. procedure TForm1.RenderScene;
  2. begin
  3.   // Dreieck auf Textur rendern
  4.  
  5.   glClearColor(0.0, 1.0, 0.0, 1.0);
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.   glViewport(0, 0, TexturSize div 2, TexturSize div 2);
  8.  
  9.   glEnable(GL_CULL_FACE);
  10.   glCullface(GL_BACK);
  11.  
  12.   glActiveTexture(GL_TEXTURE0);
  13.   glBindTexture(GL_TEXTURE_2D, textureID0);
  14.  
  15.   with Triangle_Shader_ID do begin // Triangle
  16.     TriangleShader.UseProgram;
  17.     glBindVertexArray(uiVAO[0]);
  18.  
  19.     glUniformMatrix4fv(WorldMatrix_id, 1, False, TriangleMatrix.ptr);
  20.     glDrawArrays(GL_TriangleS, 0, Length(Triangle) * 3);
  21.   end;
  22.  
  23.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TexturSize, TexturSize, 0);
  24. //   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -TexturSize div 2, -TexturSize div 2, TexturSize, TexturSize, 0);
  25.  
  26.   // Würfel rendern
  27.  
  28.   glClearColor(1.0, 0.5, 1.0, 0.0);
  29.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  30.   glViewport(0, 0, ClientWidth, ClientHeight);
  31.  
  32.   glActiveTexture(GL_TEXTURE0);
  33.   glBindTexture(GL_TEXTURE_2D, textureID0);
  34.  
  35.   glActiveTexture(GL_TEXTURE1);
  36.   glBindTexture(GL_TEXTURE_2D, textureID1);
  37.  
  38.   with Textur_Shader_ID do begin  // Rechteck
  39.     TexturShader.UseProgram;
  40.     glBindVertexArray(uiVAO[1]);
  41.  
  42.     glUniformMatrix4fv(WorldMatrix_id, 1, False, WorldMatrix.ptr);
  43.     glDrawArrays(GL_TriangleS, 0, Length(Quad) * 3);
  44.   end;
  45.  
  46.   OpenGLControl.SwapBuffers;
  47. end;  


Bei folgenden Code kommen 2 Dreiecke auf der Fläche, aber leider flackert die Textur zwischendurch.
Was noch komisch ist, wieso muss ich ein '-' eingeben ?
Code:
  1.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TexturSize, TexturSize, 0);
  2.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -TexturSize div 2, -TexturSize div 2, TexturSize, TexturSize, 0);

vertausche ich die beiden Zeilen, kommt nur ein Dreieck, aber dafür habe ich kein flacken mehr.
Code:
  1.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -TexturSize div 2, -TexturSize div 2, TexturSize, TexturSize, 0);
  2.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TexturSize, TexturSize, 0);


Was mache ich falsch ?

So erzeuge ich den Texturbuffer für das Dreieck.

Code:
  1.   GetMem(DataPointer, TexturSize * TexturSize * 4);
  2.   //    FillChar(DataPointer^, TexturSize * TexturSize * 3, $00);
  3.   glGenTextures(1, @textureID0);
  4.   glBindTexture(GL_TEXTURE_2D, textureID0);
  5.  
  6.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexturSize, TexturSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, DataPointer);
  7.  
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  10.   glGenerateMipmap(GL_TEXTURE_2D);
  11.   Freemem(DataPointer);  

_________________
OpenGL


Zuletzt geändert von mathias am Mo Apr 13, 2015 19:17, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glCopyTexImage2D
BeitragVerfasst: So Mär 08, 2015 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe den Fehler gefunden, wen man glCopyTexSubImage2D nimmt, geht es ohne Probleme,

Code:
  1.   SizeX := TexturSize div maxX;
  2.   SizeY := TexturSize div maxY;
  3.  
  4.   for x := 0 to maxX - 1 do begin
  5.     for y := 0 to maxY - 1 do begin
  6.       glCopyTexSubImage2D(GL_TEXTURE_2D, 0, x * SizeX + RandX, y * SizeY + RandY, x * SizeX + RandX, y * SizeY + RandY, SizeX - 2 * RandX, SizeY - RandY * 2);
  7.     end;
  8.   end;  


Jetzt wird das Dreieck gerastert auf dem Würfel dargestellt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glCopyTexImage2D
BeitragVerfasst: Mo Mär 09, 2015 09:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
mathias hat geschrieben:
Bei folgenden Code kommen 2 Dreiecke auf der Fläche, aber leider flackert die Textur zwischendurch.
Was noch komisch ist, wieso muss ich ein '-' eingeben ?
Code:
  1.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TexturSize, TexturSize, 0);
  2.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -TexturSize div 2, -TexturSize div 2, TexturSize, TexturSize, 0);


Das ist Zufall, mit glCopyTexImage2D arbeitest du im Koordinaten-Bereich des Fenster. Sprich negative Punkte sind undefiniertes Verhalten.

mathias hat geschrieben:
vertausche ich die beiden Zeilen, kommt nur ein Dreieck, aber dafür habe ich kein flacken mehr.
Code:
  1.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -TexturSize div 2, -TexturSize div 2, TexturSize, TexturSize, 0);
  2.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TexturSize, TexturSize, 0);



glCopyTexImage2D kopiert einen Bereich aus deinen READ_BUFFER und erzeugt daraus neue Texturdaten fuer deine gebundene Textur. Das siehst du daran, das du zum Beispiel deine Textur groesser oder kleiner machen kannst. Es ist in diesen Sinne also nichts anderes als glTexImage2D. Nur das dein Zeiger eben anders ist.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glCopyTexImage2D
BeitragVerfasst: Do Mär 12, 2015 23:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Müsste dieser Befehl nicht den alten Textur-Inhalt überschreiben ?

Code:
  1.   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TexWidth, TexHeight);


Das Lazarus-Icon ist der alte Inhalt der Textur, das Schiff ist der neue Inhalt, der gerendert wird.
Das Schiff ist ein Rechteck mit einer Textur, welche ich als Background benutze.

Das komische dabei, wen ich den Würfel angucke, je näher die Pixel sind, desto deutlicher wird da Schiff.
Wen ich alternativ des Lazarus-Zeichens, eine komplett weisse Fläche mache, sieht das ganze wie im Nebel aus.

Was noch interessant ist, wen ich das Fenster verkleinere, dann verschwindet das Schiff ganz.

Ein Grafik-Bug kann das nicht sein, da auf meinem 2. PC mit Linux der gleiche Fehler auftritt.

Code:
  1. procedure THauptForm.Timer1Timer(Sender: TObject);
  2. const
  3.   TexWidth: integer = 1024;
  4.   TexHeight: integer = 1024;
  5. begin
  6.   glClearColor(1.0, 1.0, 0.0, 1.0);
  7.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  8.  
  9.   glEnable(GL_CULL_FACE);
  10.   glCullface(GL_BACK);
  11.  
  12.   glViewport(0, 0, TexWidth, TexHeight);
  13.   OpenGL.Camera.Perspective(30, TexWidth / TexHeight, 0.3, 100, -5, 1 / 150);
  14.  
  15.   MyBackGround.Draw(texBackGround);
  16.  
  17.   glActiveTexture(GL_TEXTURE0);
  18.   glBindTexture(GL_TEXTURE_2D, CubeTextur.ID);
  19.   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TexWidth, TexHeight);
  20.  
  21.  
  22.   glClearColor(0.0, 0.0, 0.0, 1.0);
  23.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  24.  
  25.   glEnable(GL_CULL_FACE);
  26.   glCullface(GL_BACK);
  27.  
  28.   glViewport(0, 0, ClientWidth, ClientHeight);
  29.  
  30.   MyBackGround.Draw([CubeTextur]);
  31.   Cube.Draw([CubeTextur]);
  32. //  MyBackGround.Draw([CubeTextur, texBackGround]);
  33. //  Cube.Draw([CubeTextur, texBackGround]);
  34.  
  35.  
  36.   OpenGL.SwapBuffers;
  37. end;  


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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glCopyTexImage2D
BeitragVerfasst: Fr Mär 13, 2015 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich diese beiden Zeilen einbaue, ist der Fehler weg.
Code:
  1. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  2. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  


Wieso das so ist, weis ich nicht. :roll:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glCopyTexImage2D
BeitragVerfasst: Fr Mär 13, 2015 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Benutzt du Mipmapping? Wenn ja, dann hängen evtl. noch die Mipmaps der alten Textur im VRAM, weil keine neuen erzeugt wurden. Das würde den Übergang erklären, weil die GPU von einer auf die nächste Mipmap-Stufe fadet.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 36 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.129s | 17 Queries | GZIP : On ]