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

Aktuelle Zeit: Mi Mai 15, 2024 10:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 21, 2013 17:36 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Servus,

bin gerade dabei mein Terrain zu erstellen. Die höhe kann man schon ändern, also Berge erstellen, sogar mit Kollision per Newton :).
Die erste Frage die sich stellt, habe ca. 20.000 Dreiecke die als Quad gezeichnet werden. Pro Quad eine Textur. Wird normalerweise über das Terrain nur eine Textur gelegt oder so wie ich es jetzt mache pro Quad eine Textur?
Weil das ganze sieht halt schon recht komisch aus.

Das nächste ist halt das vermischen der Texturen. Das ganze wollte ich per Multitexturing lösen. Habe auch schon gelesen das es über den Alphakanal erstellt wird. Nur das wie. Da wo ich male, würde ich dann in den Alphakanal malen, kann mir das ganze noch nicht so wirklich vorstellen. Wollte es nicht per Shader lösen, eventuell später.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 21, 2013 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also bist du Multitexturing per FixedFunction implementiert hast und es auch funktioniert, hast du den Shader so längst am laufen. ;) Und wenn du dich in diese FixedFunction-Combinerer einliest ist das unnützes Wissen. Mit Shadern, wenn deine Engine das einmal kann, geht das DEUTLICH einfacher....du schreibst einfach hin was du rechnen willst.

Im übrigen rate ich dir auch davon ab jedes Quad einzeln zu rendern, was du scheinbar tust wenn jedes eine eigene Textur hat.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 21, 2013 22:18 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Für den Anfang scheue ich die shader noch etwas, eventuell doch mal anschauen.
Im edit modus wird per octree gerendert. Wenn das Terrain nicht mehr verändert wird, wird es per octree und displaylist gerendert. Aber ich binde zu beginn nur eine Textur.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 23, 2013 14:28 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Gibt dazu eventuell ein Beispiel? In der Sammlung gibt es zwar einen Shader, aber wie übergebe ich die n Texturen weiter und wie entscheide ich wo gezeichnet wird?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 23, 2013 20:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Hier, ignoriere einfach den Vertexshader und übernimm nur den Fragmentshader:
http://wiki.delphigl.com/index.php/shader_Terrain_GPU4

Die Kontrolltextur "alpha" enthält in den RGB-Kanälen die Alphawerte für die drei Texturlayer.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 24, 2013 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Auf lange sicht macht es Sinn möglichst wenig im Shader zu machen, wenn es nicht notwendig ist aber genau auf diese zu setzen, wenn man permanente Änderungen in den Daten hat.
Um den Shader kommt man aber irgendwann nicht mehr rum.

Eine sehr einfache und effiziente Variante ist das generieren von Kacheln per CPU zu machen und dann nur noch das VBO und die jeweiligen Texturen zu binden.
Man legt eine Kantengröße fest, wie stark tesseliert werden soll und dann generiert man für jede Kachel das triangle Mesh mit der Höhe.
Das UV kann man hier gleich mit generieren aber auch im Shader machen, was halt ein bisschen mehr Performance bringt.
Das UV-Set sollte für jede Kachel von 0-1 gehen, im Shader würde man vor der Transformation mit der ModelviewProjectionMatrix einfach die Kantenlänge als Konstante übergeben und dann "uv=position.xz/edgeSize;" die UV's generieren, das spart Bandbreite.

Wieso sollte man die UV's per Shader generieren aber nicht die Höhen ?
Entweder benutzt man ein Geometry-Shader zum generieren der tesselierten Kacheln und verwendet eine Vertex-Shader und Textur mit Höhendaten oder man schickt ein VBO mit XYZ durch die Pipeline.
Der Vorteil von dem Geometry-Shader ist, man sendet nur 4x XYZ für die Eckpunkte und dann bindet man eine float Höhenmap, was natürlich die Bandbreite erheblich reduziert aber es sind immer die Texturzugriffe da, die für jedes Vertex durchlaufen.
Das macht diese Möglichkeit sehr sehr langsam(Texturzugriffe sind das 2. langsamste, was man auf der GPU machen kann, Nr. 1 ist in eine Textur schreiben ^^).
Eine gute Alternative ist es die XYZ Daten einmal zu generieren und dann die UV's im Vertex-Shader zu berechnen, da man so nicht auf den Grafikkarten Speicher zugreifen muss und sich 2 floats beim transport sparen kann.

Das mischen von Texturen ist per GPU sehr limitiert und sieht selten schön aus(für Comic style funktioniert es teilweise).
Berechne die Textur per CPU oder GPU vor und nutzte nur noch das resultierende Ergebnis zur Laufzeit.
Offline berechnete Texturen erlauben viel mehr Möglichkeiten und machen das ganze Rendering wesentlich einfacher.
Es gibt sehr tolle Tools, wie z.B. World Machine oder MudBox, welche Texturen und Terrain generieren können.

Es gibt noch viel mehr Technische Möglichkeiten aber das kann man sich für die Zukunft aufheben.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 24, 2013 19:41 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
wow, ganz schön viel für den Anfang :).

Habe für den Anfang nur den Fragmentshader verwendet. Okay soweit so gut.
Im Tutorial glsl findet man unten auch einen Shader mit einer Textur für den Verlauf.
Da ich das besser verstehe und einfacher aussieht, habe ich dieses Beispiel verwendet.
Aber so ganz wird nicht das angezeigt was im Tut dargestellt wird.
So binde ich das ganze
Code:
  1.  
  2.   glPushMatrix;
  3.     glTranslatef(0,2,0);
  4.     glTexturBindMultiName(['verlauf.jpg','kiste.jpg','2.jpg','5.jpg']);
  5.       glUseProgram(ProgramObject);
  6.       wurfel;
  7.       glUseProgram(0);
  8.     glTexturUnBindMulti;
  9.   glPopMatrix;
  10.  

Man sieht noch den Farbverlauf, anbei ein Screen. Sieht aus ob die Texturen einfach nur verblendet wurden...


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 29, 2013 15:25 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Nachdem ich es hetzt hinbekommen habe, wollte ich mehr als 3 texturen verwenden.
Dachte mir es würde so funktionieren
Code:
  1.  
  2. uniform sampler2D Texture0;
  3. uniform sampler2D Texture1;
  4. uniform sampler2D Texture2;
  5. uniform sampler2D Texture3;
  6.  
  7. void main(void)
  8. {
  9.  vec2 TexCoord = vec2(gl_TexCoord[0]);
  10.  vec4 RGB      = texture2D(Texture0, TexCoord);
  11.  vec4 Color_r  = vec4(1.0, 0.0, 0.0, 0.0);
  12.  
  13.  gl_FragColor  = texture2D(Texture1, TexCoord) * Color_r+
  14.                  texture2D(Texture2, TexCoord) * RGB.g+
  15.                  texture2D(Texture3, TexCoord) * RGB.b;
  16. }
  17.  

Geht aber leider nicht, das Objekt wird rot. Wollte halt für verschiedene Texturen die Farben festlegen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 29, 2013 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Was soll den Color_r sein? Du nimmst nur den roten Farbkanal von Texture1? Ich vermute stark hier soll RGB.r hin? Übrigens hat das ganze nur Sinn wenn du für die Kontrolltextur (Texture0) andere Texturkoordinaten benutzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 29, 2013 23:00 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Da stand vorher RGB.r aus dem Tut.
Ich wollte mehr als nur 3 Texturen verwenden. Also wollte ich für jede Textur eine andere Farbkombination erstellen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 30, 2013 09:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also die Idee und der Vorteil dieser Technik ist es das du nicht nur jede deiner Layer-Texturen darstellen kannst, sondern du kannst auch beliebige weiche Übergänge dazwischen produzieren. Die einzige Bedingung dafür ist, dass die Summe der Faktoren in der Kontrolltextur immer 1 ergibt. Anderenfalls erhältst du verfälschte Farben und/oder Helligkeiten.

Also für eine 4. Textur kannst du einfach den Alpha-Kanal von Texture0 benutzen, also ca. so:
Code:
  1. vec2 TexCoord = vec2(gl_TexCoord[0]);
  2. vec4 control = texture2D(Texture0, TexCoord);
  3. gl_FragColor  = texture2D(Texture1, TexCoord) * control.r +
  4.                  texture2D(Texture2, TexCoord) * control.g+
  5.                  texture2D(Texture3, TexCoord) * control.b+
  6.                  texture2D(Texture4, TexCoord) * control.a;


Falls du mehr Texturen willst empfehle ich dir das Terrain in Stücke zu schneiden. Das machst du ja wahrscheinlich sowieso für FrustumCulling. Also du würdest für jedes Terrainstück nur die 4 Texturen im Shader verwenden die auch wirklich an dieser Stelle benötigt werden. Im Zweifel die 4 am stärksten vorhandenen. Mehr als 4 Texturen an einer Stelle machen sowieso wenig Sinn, da kommt nur Farbmatsch raus. Übrigens bekommt man mit 3-4 Texturen schon durchaus ein ansehnliches Terrain hin.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 30, 2013 10:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du kannst auch mit drei kanälen vier texturen mixen, indem du z.B. mit Rot zwischen Textur1 und Textur2 mischst (also c1 = rot*Textur1 + (1-rot)*Textur2) und mit Grün zwischen Textur3 und Textur4 (also c2 = grün*Textur3+(1-grün)*Textur4). Dann nimmst du blau um zwischen c1 und c2 zu mischen: c3 = (blau)*c1 + (1-blau)*c1 (c3 ist dann deine Ergebnis-Farbe). Das ist zwar etwas komplizierter, aber du hast nicht mehr die sorge, dass r+g+b=1 sein muss und du kannst mit drei reglern vier Texturen mischen. Mit vier Reglern kannst du dann fünf texturen mischen, indem du mit alpha dann c4 = alpha*Textur5+(1-alpha)*Textur5 machst (dann ist c4 deine Ergebnis-Farbe) :) Hoffe das war klar.

grüße.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 30, 2013 10:45 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Ah okay. Danke.
Wollte mehr Texturen verwenden um eventuelle Details darzustellen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 30, 2013 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Bedenke aber das diese Technik(Splatmap/Blendmap) seinen Preis hat.
Du benötigst die 4 Kachel Texturen und eine 4 Kanal Blend Texture in voller Auflösung, was im Shader 5 Texturzugriffe sind und man hat mit DX9 bzw. OpenGL auf DX9 fähigen Karten nur 8 Texturen und die Texturzugriffe sind sehr teuer.
Man kann mit DX10 und aufwärts mehr Texturen binden, hat mehr Speicher und die Karten sind schneller, was diese Technik toller macht aber wir haben in unserer aktuellen Produktion, auf Arbeit, fest gestellt, dass die maximale Qualität schnell erreicht ist und sehr undetailiert ist. Geschweige der Renderzeit die der Shader gegessen hat.
Ich habe dann noch Prozedurale Texturen und Wang-Tiles probiert und nix kam an den Detailgrad/Leistung Tradeoff von einer normalen vorgerenderten Textur ran.

Wenn Detailgrad nicht so wichtig ist und auch kein DX9 fähige Hardware supportet werden soll, dann empfehle ich dir statt der Kacheltextur Wang-Tiles zu verwenden.
Damit kannst du aus Splatmaps das maximum raus holen.
Wenn du auf neuere DX11 Hardware setzen willst, dann kannst du sogar probieren die Blendmap weg zu lassen und die gewichtungen in den Vertices zu hinterlegen, wo du ja ein Color setzen kannst. Dem entsprechend muss natürlich die Trianglecount hoch, damit man recht ähnliche Qualität erreicht aber es ist trotdem schneller.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 17 Queries | GZIP : On ]