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

Aktuelle Zeit: Mi Mai 29, 2024 01:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mo Dez 07, 2009 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi,
ich schreibe gerade an einem Shader der aus 2 Texturen den "Boden" einer Map zeichnet. Dabei gibt die eine Textur die Bodentextur an, in der anderen Textur sind dann 256*256 Große Texturen zusammengefasst die dann ausgelesen werden. Jetzt habe ich allerdings das Problem der Interpolation. Da es bei der einen Textur um genaue Werte gehat, darf keine Interpolation statt finden, allerdings sieht alles rechteckig aus, wenn ich als Textur Filter-Parameter GL_NEAREST eingebe, da mit der Manhattendistanz gerechnet wird. Habt ihr eine Lösung wie ich es nicht eckig hinbekomme, also alle umliegenden Pixel zu einem Punkt die Distanz 1 haben? Ich hatte auch auf die glsl-Funktion Round() gesetzt, allerdings zeigt mein Shader mir dann "Warning: global funktion round requires "Version#130" or later".

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mo Dez 07, 2009 19:21 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Vorausgesetzt ich verstehe dein Problem richtig, könntest du das so lösen:

Für einen Bildschirmpixel berechnest du die Position in seinem Viereck des Rasters. Wenn dein Raster entlang der Koordinatenachsen ausgerichtet ist, würde das für den Punkt (5.5,4.6) in Weltkoordinaten (0.5,0.6) ergeben. Also einfach der Nachkommateil. Die beiden Zahlen werden benutzt um zwischen den Texturen zu interpolieren. Dann ermittelst du die 4 Farben die der Pixel hätte, wenn er vollständig aus dem Material von jeweils einer Ecke wäre. D.h. du schaust was für ein Material an den Punkten (5,4), (5,5), (6,4) und (6,5) ist und benutzt dann die Werte als Index für die tatsächliche Textur. So wie du das warscheinlich jetzt schon machst.
Der Unterschied kommt jetzt dadurch das du nicht nur einen Farbwert hast sondern alle 4 die den Pixel beeinflussen sollen.
Dann musst du wie gesagt nur noch zwischen den Farben interpolieren. Wenn du die Farben von (5,4) und (6,4) mit dem Wert 0.5 interpolierst und das Paar (5,5) (6,5) mit den selben bekommst du wieder zwei Werte, die du das mit 0.6 interpolierst. Das Ergebnis wäre dann die entgültige Farbe für den Pixel.

Also im Prinzip werden nicht die Indizes interpoliert (was falsche Werte erzeugen würde, wie du schon erkannt hast), sondern die Farben.

Wenn du mit Texturkoordinaten rechnest, statt mit Raumkoordinten, solltest du die Koordinaten von den Indizes mit der Größe der Textur multiplizieren, dann auf eine Ganze Zahl runden und dann wieder mit der Größe dividieren, damit ein Koordinatenpaar aus zwei ganzen Zahlen immer genau auf einem Texel ist und umgedreht auf einem Texel auch immer nur ein Paar ist.

Außerdem kann man statt den vier umgebenden Punkten auch noch mehr nehmen, damit der Kantenverlauf glatter wird.

Ich hoffe mal das war einigermaßen verständlich ausgedrückt, sodass es dir auch hilft und dich nicht noch mehr verwirrt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Di Dez 08, 2009 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Schläfer: Leider hat mich das doch ein bisschen verwirrt.

Ich habe jetzt aber eine Lösung gefunden. Ich schreibe jetzt:
Code:
  1. TexNr=TexNr-mod(TexNr,1.0);

So kann ich jetzt runden, damit fallen die interpolations Fehler weg. Ich habe jetzt noch ein If eingefügt um ab >0.5 aufrunden zu können.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Di Dez 08, 2009 19:21 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, vielleicht hatte ich auch dein Problem falsch verstanden. Wolltest du weiche Übergänge von einem Bodenmaterial zum anderen oder einen scharfen Übergang mit abgerundetem Kantenverlauf?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 14:20 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Gibt es in Shadern keine Möglichkeit nur den Absolutteil einer Variablen zu nutzen? Also ein Trunc() entsprechendes Kommando? Das ist doch genau das, was du mit einem x := x - (x mod 1) machst, oder?

Und, um dir dein If zu sparen könntest du einfach, bevor du "rundest" die Variable um 0.5 erhöhen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@zioX: Bei trunc zeigt er mit den gleichen Fehler wie bei round an, also "Warning: global funktion trunc requires "Version#130" or later".

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 14:26 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Gut okeh, dann drehen wir uns da also im Kreis - nichts desto trotz sollte es dir ein If sparen, wenn du die Erhöhung um 0.5 machst ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 14:49 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Hallo mori, ich habe da eine Diskussion gefunden: http://www.jmonkeyengine.com/forum/inde ... pic=9058.0
Deine Problemstellung habe ich leider nicht verstanden, weil ich mir kein Bild machen konnte. Aber zumindest runden ohne round und trunc wird dort erklärt. An sonsten freuen sich natürlich Besitzer einer neueren Grafikkarte, wenn du einen #version 130 Shader mit round und trunc verwendest. 8)

EDIT: Da steht auch, dass der Datentyp int auf 16 Bit begrenzt sei. Das ist in neueren Shaderversionen auf 32 Bit erhöht worden, aber Vorsicht ist geboten wenn man einen float unbedacht in einen int wandelt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Man kann auch einfach zu Integer casten:
Code:
  1. float x = 13.37;
  2. int y = int(x);

Bin mir aber nicht sicher ob das so mit älteren Shader-Versionen geht. Insbesondere haben Integer mit GLSL 1.2x nur 16bit Auflösung.

Mit GLSL 1.3x bzw.
Code:
  1. #extension GL_EXT_gpu_shader4 : enable

sollte das aber mit 32bit Auflösung funktionieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 17:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Danke für die Antworten, werde warscheinlich zwei Shader schreiben, damit man auf neuen Grafikkarten auch die funktionen round etc. benutzen kann. Das casten auf Int hatte ich auch schon versucht, leider hatte es nicht funktioniert.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GL_NEAREST ohne Manhattendistanz
BeitragVerfasst: Mi Dez 09, 2009 23:14 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hast du schonmal "floor()" versucht?
aus dem ersten glslang Tutorial:
Zitat:
* genType floor (genType x)
Gibt denn nächsten Integerwert zurück, der kleiner oder gleich x ist.

Damit ab 0.5 aufgerundet wird, muss man dann einfach 0.5 vorher auf x addieren.


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 » Shader


Wer ist online?

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