Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 24.07.2005, 17:15 Titel: Farbintensität einer Textur erhöhen |
|
|
Hallo Leute,
ich möchte gerne beim Rendern die Farbintensität einer Textur erhöhen.
Ich habe schon ein bisschen mit SetTextureStageState und SetRenderState rumgespielt, bin aber nicht zufrieden. Ich möchte einfach, dass die Textur irgendwie glüht.
Das hier habe ich schon probiert:
CPP: | // hier wird die Textur gesetzt
m_pGfx->m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
m_pGfx->m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pGfx->m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
// Diesen Faktor möchte ich immer erhöhen, damit der Glow immer stärker wird
m_pGfx->m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0xff505050);
// hier wird die Textur gerendert
|
Diese Einstellungen lassen die Textur milchig aussehen. Ich hätte es aber gerne so, dass die Farben kräfter erscheinen als im Orignal-Zustand.
Ich hoffe ihr könnt mir auf die Sprünge helfen.
Danke im Voraus |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 24.07.2005, 17:22 Titel: |
|
|
Versuche mal diese Berechnung umzusetzen:
Ende = One*Textur+TexturFaktor*Textur _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 24.07.2005, 17:59 Titel: |
|
|
Ich weiß nicht genau, was du unter Farbintensität verstehst, aber ich bilde mir ein, wenn man die RBG-Komponenten einer Farbe gleichmäßig nach unten setzt, so wird diese dunkler und wirkt intensiver. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2005, 23:00 Titel: |
|
|
Hmm...ich würde unter der Farbintensität was anderes verstehen. Nämlich die Unterschiede der R-, G- und B-Werte. Ein neutrales Grau(egal wie hell) hat R=G=B, d.h. alle Werte sind gleich. Eine intensive Farbe wie Rot hat 255,0,0.
Deshalb würde ich jetzt mal sagen, eine intensive Farbe hat große Differenzen zwischen den R-, G- und B-Werten. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 25.07.2005, 00:27 Titel: |
|
|
Sowie TLOP das beschrieben hat, habe ich auch zu erst gedacht. Man könnte mal Probieren den größten der RGB-Faktoren zB mit dem Faktor 1,25 den zweiten mit 1 und den dritten mit 0,75 zu multiplizieren zB! |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 25.07.2005, 00:49 Titel: |
|
|
So, ich bins nochmal. Ich wurde gerade selbst von Neugier und Ehrgeiz erfasst und hab mal eben meine Engine angeworfen und das ganze an Cg Fragment Shader ausprobiert.
Rausgekommen is das hier, ich hab insgesamt 5 Verfahren getestet:
click to view jpg (163kb)
click to view PNG (bessere Quali aber 1,2MB)
Zu den Verfahren:
I. keine Modifikationen, das normale Bild
II. der höchste der RGB Werte wird mit 1.25f, der nächste mit 1.0f und der kleinste mit 0.75f multipliziert.
III. Alle Werte wurden mit 1.25f multipliziert.
IV. Der höchste Wert multipliziert mit 1.25f, die anderen mit 1.0f.
V. Alle Werte wurden mit 0.75f multipliziert.
Ich persönlich finde Variante II mit Abstand am besten aber entscheidet selbst, wahrscheinlich sieht IV bei euch besser aus als bei mir, da ja Farbunterschiede normalerweise bei TFTs etwas verloren gehen. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.07.2005, 12:05 Titel: |
|
|
Ja, sieht doch gut aus. Mir gefällt II auch am besten. Zwischen III und V ist hier kaum ein Unterschied erkennbar(CRT). Auf meinem TFT drüben hab ich den Kontrast relativ hoch, die Farben sind da sehr intensiv _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 25.07.2005, 12:09 Titel: |
|
|
yeah, das mit dne Farben scheint echt zu stimmen, 2 sieht viel intensiver aus. Würde man den kleinsten mit 1,25 und den größten mit 0,75 multiplizeirne würdest, wäre es warhscheinlich deutlich matter, ne? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.07.2005, 12:31 Titel: |
|
|
Jepp, aber notfalls sollte man auch noch einen Überlaufschutz einbauen. Sonst bekommt man vllt. mal mehr als 255 heraus. Oder wenn man etwas matter machen will, kanns auch sein, dass man die Werte "aneinander vorbei multipliziert", sodass die Farbwertdifferenz letztendlich nicht kleiner geworden ist. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.07.2005, 13:39 Titel: |
|
|
Die Technik funktioniert echt ganz gut.
Aber es gibt bestimmt auch noch andere Techniken die noch zuverlässiger sind. So Sachen mit If-statements und konstanten Werten haben meistens die Eigenschaft einen Haken zu haben...
Ich nehme mal an man muss irgendwie die Differenzen zwischen den Farbwerten vergrößern.
Eigentlich müsste es folgendermaßen funktionieren:
1) Man errechnet den Durchschnitt der drei Farbwerte.
2) Man nimmt für jeden Farbwert die Differenz zu diesem Mittelwert multipliziert sie mit dem Intensitätsfaktor (1 normal, 2 doppelt so kräftig, 0 grau) und addiert das Ergebnis zum Mittelwert.
In C++ Code sähe eine Funktion um die Intensität eines Pixels zu ändern also so aus:
Code: | D3DCOLORVALUE* ChangeIntensity(D3DCOLORVALUE* out, D3DCOLORVALUE* color, float intensity){
float average=(color->r+color->g+color->b)/3;
out->r=average+(color->r-average)*intensity;
out->g=average+(color->g-average)*intensity;
out->b=average+(color->b-average)*intensity;
return out;} |
Ich habe allerdings keine Ahnung wie man das mit der fixed function pipeline umsetzen könnte. Mit pixelshadern geht's natürlich ganz einfach. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 25.07.2005, 14:17 Titel: |
|
|
naja, in aktuellen Spielen werden ja sehr viele Shader eingesetzt. Demnach würde da doch nicht so viel gegen sprechen, oder? Dumm nur das ich kaum Plan von Shadern habe. Wäre doch ien nettes Beispiel für ein Shader Tut, oder? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 25.07.2005, 14:43 Titel: |
|
|
Man muss aber nicht alles mit shadern machen.
Langt es nicht wenn du zwei Texturen übereinanderlegst und den blend mode auf Multiplikation/Addition stellst? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.07.2005, 14:46 Titel: |
|
|
Von Pixel Shadern hab ich auch net sooo viel Ahnung, weil meine Grafikkarte die nicht unterstützt *grummel*. Ich glaube so langsam führt kein Weg mehr dran vorbei mir mal ne Neue zu kaufen. Aber in "3D-Effekte für Spieleprogrammierer" hab ich jetzt gelernt wie HLSL Pixel Shader funktionieren. Als Beispiele gibt es da aber besseres. z.B. erstmal ein ganz normaler Pixelshader der eigentlich genau das gleiche macht wie die fixed function pipeline mit D3DTOP_MODULATE und dann ein Bump-mapping shader (so wird's in "3D-Effekte f. S." gemacht).
EDIT
ich hasse es wenn man einen Post schreibt den dann abschickt und zwischendurch schon wieder wer anders geschrieben hat. Das bezog sich auf Jonathan Kleins Post.
@PeaceKiller
Hab ich auch schon überlegt. Das könnte mit D3DTOP_LERP gehen. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 25.07.2005, 15:14 Titel: |
|
|
Peacekiller hat schon recht, alles mit Shader muss man nicht machen. Vorallem sollte ein vernünftiges Programm ja auch einen Fallback Modus haben, da ja noch nicht mal annähernd alle eine Shader-GraKa haben. Leider hab ich von den DX Parametern überhaupt keine Ahnung, daher weiß ich nicht wie man eine ähnliche Modulation erzeugen könnte. Hier sieht man aber mal den enormen Vorteil von Shader und vorallem von Cg, schließlich konnte ich die Shader eben schnell in C Code schreiben, mit if() und allem drum und dran! |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 25.07.2005, 15:24 Titel: |
|
|
Der Kontrast ist aber etwas anderes als die TexturIntensität
Intensität:
Code: | Resultat = Textur*Intensität |
Kontrast:
Code: | Resultat = Textur^Kontrastwert |
Den Kontrast kann man aber auch anders Berechnen ist dabei aber viel billiger:
Code: | Resultat = Textur*Kontrastwert*2 (Kontastwert im Bereich 0.0-1.0) |
Die 2te Kontrastvariante sollte dabei im FFP Lösbar sein, leider bietet DirectX kein Blendmode Modulate2x an was Kontrastwert*2 ersetzen würde. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
|