Hi
Ich habe ein Problem (nein sowas..)
und zwar habe ich bei den UV-Koordinaten Werte>1 eingegeben, damit sich die Textur wiederholt. Auf meinem alten Rechner sah das wunderbar aus, nämlich so:
Aber jetzt auf meinem neuen (viel viel besseren PC mit neuster Grafikkarte und aktuellem Treiber) sieht das ganze dann leider so aus:
Was könnte ich im Programm ändern, damit das wieder schöner aussieht??
EDIT: Da fällt mir noch was ein:
Die Programme, die ich auf meinem alten PC kompieliert habe und auf dem Neuen laufen lasse, sehen aus wie Fall 1.
Diejenigen, die ich auf meinem neuen PC kompiliert habe sehen auf ebendiesem neuen PC aus wie Fall 2.
Die Programme, die ich auf meinem alten PC kompiliert habe sahen auf dem Rechner eines Freundes aus wie Fal 2.
Also sehr verzwickt die Angelegenheit.....
_________________
Zuletzt geändert von Maricello am Do Jan 27, 2005 20:03, insgesamt 1-mal geändert.
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
so, es klappt tatsächlich. Aber immer noch ists komisch.
Also ich arbeite mit glBitmap.pas und da ist dieses Repeatding ja eigentlich automatisch eingestellt oder?? Jedenfalls soweit ich das sehe... Und auf meinem alten Rechner hattes ja auch von sich ausgeklappt...
Ein anderes Problem, was ich ebenfalls auf meinem alten PC nicht hatte:
ich hab eine Bitmapdatei in der was drinsteht (ich will Text ausgeben) und alles was nicht Text ist, ist schwarz. Jetzt render ich das mit folgendem Code:
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bin mir net ganz sicher ob deine BlendFunc die Richtige ist... Kannst ja mal im Wiki den Artikel "glBlendFunc" studieren. Eventuell hilft dir das weiter.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
na, gibts denn noch andere Methoden zum Alphablenden? Aber eigentlich hast du Recht, ich will ja nicht Alphablenden sondern eigentlich so etwas wie Colorkeying.. Aber ich weiß nicht wie man das noch anders machen könnte...
Methode a :
Du musst beim Laden der Textur einen Alphachannel erstellen und in den Alphawert im Programm mit Color-Keying erzeugen
Methode b :
Du schreibst einen Fragmentshader, der den Alphawert anhand der Farbe setzt, diese Methode hat aber einige Nachteile :
1.Sie funktioniert nur auf neueren Grafikkarten, da Fragmentshader verwendet werden müssen
2.Sie ist langsamer als Methode a, da bei Methode a einmal berechnet wird und bei Methode b jedes Fragment jeden Frame berechnet wird.
ok, also ich werd wohl Meth. A nehmen. Aber ich hab ehrlich gesagt nix verstanden..
Also worein erstell ich jetzt den Alphachannel? Kann man ja irgendwie für jeden Pixel oder? Aber wäre das nicht etwas langsam? Und was ist Colorkeying in OGL überhaupt? wie geht das da? (Ich kenns nur aus DirectDraw...)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also mit der glBitmap steht der Wrapmode standardmäßig auf GL_CLAMP_TO_EDGE. Das kannst du ändern in dem du dei globale Methode glBitmapSetDefaultTextureWrap aufrufst oder bei der Textur die Methode SetTextureWrap.
OpenGL kennt kein Colorkey! OpenGL benutzt einen zusätzlichen Alphakanal. ColorKey ist einfach nur ein Begriff für ein Stück Quellcode welches aus einer Farbe einen solchen Alphakanal für eine Textur erstellt. Das hat gar nichts mit OpenGL zu tun. Für den ColorKey kannst du bei den Klassen in der glBitmap AddAlphaFromColorKey aufrufen. Anhand von deinem Quellcode denke ich aber mal, dass du deine Texturen mittels der Methode LoadTexture lädst. Das solltest du lassen, da sie leider nicht alles zur Verfügung stellt was die glBitmap zu leisten vermag. Benutze lieber die Klasse TglBitmap2D. Dann besteht auch die Möglichkeit, dass du einen Alphakanal anhand einer Farbe erstellst. Anderfalls bleibt dir nichts anderes übrig als das in einem Grafikprogramm zu machen und in der Textur mit abzu legen.
Wenn du bei der Textur das Filtering aus gestellt hast, dann kannst du die Transparenz auch mit dem Alphatest lösen. Der macht dann anhand eines Alphawertes das Pixel sichtbar oder eben nicht. Wenn du Textur gefiltert wird, dann ergeben sich damit allerdings unschöne render. Anderfalls müsstest du halt entsprechend Blenden. Und einen Shader für so eine Aufgabe halte ich doch ein ganz klitze klein wenig übertrieben. Also vergiss das gleich wieder!
Hm, muss ich denn, nachdem ich die Instanz dann created habe dann noch was machen? (Ich übergebe als Param einen (korrekten) Dateinamen)
d.h. ich rufe jetzt noch mal für jede Instanz .GenTextures auf, dann klappts. Aber warum bringst du das nicht gleich noch in Create unter?? Oder was bringt es für einen Vorteil das noch seperat zu machen?
Alles was ich sonst noch gändert habe ist, dass ich nun statt glBind(...) nun Instanz.Bind schreibe..
Und fürn Alphawert bräcuht ich dann auch noch etwas weitere Hilfe. Also ich ruf jetzt AddAlphaFromColorKey auf. Das hat aber irgendwie noch gar nix geändert..
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich kann das nicht alles mit dem Create machen. Dann hätte ich mir auch die Klasse komplett sparen können. Die Klasse kann ein wenig mehr als nur eine Datei laden und daraus eine Textur zu generieren. Du kannst zum Beispiel eine Textur mittels einer Funktion erstellen. Du kannst eine Funktion auf die Bilddaten loslassen um ein leichtes Kriseln hinzuzufügen. Du kannst die Farbwerte des Bildes vollkommen nach deinen Wünschen anpassen. Also Invertiert. RGB getauscht. Oder lediglich den roten Kanal invertiert. Also fast alles kann man damit berechnen. In der nächsten Version werde ich auch versuchen, dass ich einen Normalenalgorithmus bekomme und diesen mit implementiere. Schau dir mal die Methode Invert von der Basisklasse an. Ich hoffe dann wirst du verstehen warum das keine Einmethoden Lösung ist.
Aber zum Verständnis. Wenn du GenTextures aufrufst, dann nimmt die Klasse die Texturdaten und generiert daraus eine Textur. Das sollte normal das Letzte sein was du mit der Textur anstellst. Außer Binden und Freigeben versteht sich.
AddAlphaFromColorKey musst du entsprechend vor GenTextures aufrufen. Evtl solltest du dann noch diverse Parameter einstellen. Also ob du MipMaps haben willst. Ob die Textur gefiltert sein soll. etc. Diese Parameter kannst du auch mittels der Standardwerte (glBitmapSet*) einstellen. Diese werden dann für alle danach erstellten Instanzen benutzt. So kannst du das entsprechend auch vereinfachen.
Allerdings denke ich mal, dass eine zusätzliche Methode kein Problem darstellen sollte. Es gibt reichlich Möglichkeiten wie man so etwas vereinfachen kann. Und sei es nur durch eine Methode die eine Instanze erstelle. Eine Datei lädt. Die Textur generiert und dann die entsprechende Instanze der Klasse zurück liefert.
ok. Und wie sage ich Delphi dann, dass er die Alphawerte aus der Textur nehmen soll? also automatisch macht es nix, so wies aussieht. Jedenfalls sehe ich immer noch ganz klar alle schwarzen Pixel.
Im Moment sage ich bei glBlendFunc eben SRC_ALPHA...
EDIT: aha, also ich darf glBlendFunc einfach nicht aufrufen scheints. Dann funktionierts jedenfalls.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also du musst
a) einen Alphakanl zu der Textur hinzufügen
und b) musst du OpenGL mitteilen, was er mit dem Kanal anstellen soll. Also entweder glBlendfunc oder glAlphafunc. Je nach einsatzgebiet ist auch schon glAlphafunc vollkommen ausreichend.
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.