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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Feb 12, 2012 21:55 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Habe diese Video bei youtube gefunden.
Kann mir einer sagen wie das mit dem Berg gemacht wird?

Berge in der Heightmap bekommt man indem man die quads verschiebt, denke ich :).
Wie bekommt man aber die Textur über bestimmte flächen so wie im Video?

http://www.youtube.com/watch?v=UEBAB-Rotp8

Nach Einsteiger-Fragen verschoben // Horazont


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Feb 12, 2012 22:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Berge in der Heightmap bekommt man indem man die quads verschiebt, denke ich :).

richtig, wobei man meist zwei Dreiecke nimmt.

Zitat:
Wie bekommt man aber die Textur über bestimmte flächen so wie im Video?

Angenommen du hast 5 verschiedene Texturen, jede davon kachelbar. Also z.B. Gras, Sand, Felsen, etc.
Zusätzlich hast du eine Alpha-Textur die nicht wiederholt wird sondern sich über die komplette Heightmap zieht. Hier speicherst du nun in den RGBA-Kanälen für die ersten 4 Texturen wie stark sie an der entsprechenden Stelle sein sollen. Den Wert für die 5te Textur kannst du aus den anderen 4 Werten berechnen, da die Summe natürlich 1 (bzw. 255) sein muss.

In der Shadersammlung gibt es sogar einen Shader der dies mit drei Texturen macht:
http://wiki.delphigl.com/index.php/shader_Terrain_GPU4
(dem komplizierten Vertexshader kannst du ignorieren, wobei der aber sicher auch interessant ist)

Falls du dich bisher noch nicht an Shadern versucht hast wäre dies ein Grund damit anzufangen. Mit einem Fragmentshader ist diese Aktion nämlich deutlich einfacher als mit der festen Pipeline.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 13, 2012 08:38 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Ah okay, thx.
Dann werde ich mir mal den Shader anschauen....


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 13, 2012 09:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
(der Thread sollte ggf. von einem Mod ins Einsteiger-Forum oder OpenGL verschoben werden)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 13, 2012 10:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
In den meisten spielen wird statt einer textur, die Daten, in die verticecolor gespeichert.
Der Grund ist einfach, da man so nur 4Texturen bindet und man sich ein indirect call spart, der im shader die parallelisierung zu nichte machen würde.
So ein indirect call sorgt intern dafür, dass erst, wenn der der texel fetch, auf die Colormap durch ist den restlichen folgenden code parallelisiert. Das reduziert die performance stark und macht auf älteren Geräten dann entsprechende Probleme.
Bei der Variante mit den verticecolor hat man dann weniger feinheit aber man kann selbst bei alter Hardware das Mesh hoch tesselieren und damit die feinheit an gewollten stellen erhöhen.
Die verticecolor liegen im register und damit sind diese gecached und darauf aufbauender code kann sorglos parallelisiert werden und ist durch den cachevorteil auch wesentlich schneller.
Auf neueren Karten empfehle ich TextureArrays zu verwenden und auf alten Geräten die Texturen ind die 4Textureslot zu werfen.
TextureArrays sind schneller als einzelne Texturebindings, da mit einem binding mehrere Texturen mit einmal gebunden werden.
Problematisch wird es, wenn man noch normalmaps, specmaps und detailmaps haben will, da man so schnell an das hardwarelimit bei texturebindings, speicher, shaderkosten und maximale anzahl an texturefetches im shader stösst.

_________________
"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 Feb 13, 2012 18:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Thomas :D das war wieder 1a mit ner BFG auf ne kleine Ameise geschossen. Prädikat: Sehr gut.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 14, 2012 11:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Was mich bei der geschichte viel eher interessiert, wie macht man es gescheit das man eine Textur painten kann in 3D?

Also man hat das 3D Objekt (mit gescheiten UVs natürlich) und will dort dann einfach draufmalen wie in dem Video oben.
Irgendwie muß ja die Projektion vom 3D-Pinsel auf die 2D-UV ebene passieren.

Das geht bei ner planaren fläche noch recht simpel, aber bei etwas komplexeren Objekten wo eventuell die UVs auch seams haben und nicht perfekt ausgerollt sind..?

Also wenn ich beispielsweise bei einer Sphere oben am pol mit einem 50px Pinxel nen klecks hinmache, müßte in der Sphere Textur der komplette obere 50px balken farbig sein.

Irgendwer ne idee wie das geht?

Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 14, 2012 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
phlegmatiker hat geschrieben:
Thomas :D das war wieder 1a mit ner BFG auf ne kleine Ameise geschossen. Prädikat: Sehr gut.


Ich finde Thomas' Beiträge immer besonders informativ. Wo sonst soll man solche Informationen herbekommen, ausser durch stundenlanges Suchen? Wenn überhaupt.


@Aya:

Hab in den letzten Tagen einiges mit Blender gemacht. Unter anderem auch UVs erstellen/ausrichten/bemalen.
Blender scheint einen Rekursiven Ansatz zu verfolgen und dabei die angrenzenden Dreiecke durchzugehen.
Wenn man z.b. die Kugel am Pol bemalt, werden einige Dreiecke mehrfach übermalt und wenn man einen relativ weichen Pinsel verwendet entstehen dabei viele hässliche Artefakte. Da bleibt einem dann nicht viel anderes übrig, als die Pole im UV einzeln zu platzieren um solche Loops zu vermeiden.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 14, 2012 13:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Man kann anhand des schnittpunktes, eines raycasts, den uv Koordinaten, des schneidenen triangles(pinselgröße würde hier die schneidenden triangles beeinflussen) die pixel auf der textur errechnen. Das Problem ist für mich eher im letzen Schritt, denn wenn die uvs nicht schön auf der textur ausgebreitet sind, werden die pixeloperationen kompliziert und können qualitätsverlust mit sich ziehen.
ich will ja unterschiedliche qualitätsstufen, z.B bei Plakaten oder nicht erreichbare Gebiete.
Also sollte der Pinsel auch Auswirkungen auf die Qualität haben.
Leider gibt es nicht viel zu lesen, ID Soft hat viel gezeigt aber UV ist ausgespart worden.

_________________
"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: Di Feb 14, 2012 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

wie ich die pixel in der textur direkt unter dem pinsel rausbekomme ist ja kein problem, nur der Pinsel ist halt in der Regel nicht nur 1px groß :)

Das es qualitätsverlust bedeutet je nach UV Layout ist klar und unvermeidbar. Es geht auch in erster linie noch garnichtmal darum wirklich eine Textur zu painten, sondern eher eine Alphamaske oder Ähnliches.

Ganz vereinfacht könnte man auch hergehen und sagen "Mein Pinsel hat einen radius von 30px und färbt weiß". Den Texel direkt im Zentrum zu finden (im UV Space) ist noch sehr einfach - wie aber finde ich alle texel die im bereich < 30px herum liegen? Bruteforce mäßig jedes Texel in UV Space transformieren ist irgendwie nicht so ideal..

Aya

PS: Den sonderfall das UVs sich überlappen sollte man bei den überlegungen erstmal aussen vorlassen, da ist gescheites Painten (sofern es nicht symetrisch gespiegelte UVs sind) sowieso fragwürdig..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 14, 2012 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich weiß, dass es eine demo gab, in der über projektion in den fbo gezeichnet wurde und durch denn fragmentshader werden ja automatisch die pixel ermittelt und können dann durch die projezierte textur beschrieben werden. Wie das im detail geht, weiß ich leider nicht, da ich nicht wirklich viel mit gemacht hab aber die Variante ist gpu basiert. Das wurde in dem beispiel, woran ich gerade denke für die decals verwendet.

_________________
"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  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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