Seite 1 von 1

Fancy Reflexionen

Verfasst: 27.04.2025, 17:03
von Jonathan
Moin, eine Frage an die Grafikprogrammierer unter euch (GLSL): Wie kriege ich schicke Reflexionen auf meinem Kirchendach?

Ich baue ja gerade den Dom neu, der soll was hermachen, also will ich ein paar schicke bling-bling Effekte haben. Das Dach im Original ist aus Metall, dieses typisch grün-blaue Kufperdach. In echt sieht es eher matt aus, aber es geht mir ja um schicke Optik und nicht um Realismus, also muss es funkeln. Das Dach ist groß und immer sichtbar, also idealer Kandidat für ein besonderes Material.

Nun gut, hier der aktuelle Stand:
2025-04-27_17-15-48_Modelviewer.jpg
Und als Video:
dom.mp4
(13.99 MiB) 17-mal heruntergeladen
Aktuell benutze ich als Standard-Modell das "Frostbite-BRDF"-Modell was im Grunde wie Phong, nur in netter ist: Man hat für eine Lichtrichtung diffuse und spekulare Komponenten, es ist energieerhaltend und man hat Roughness und Metalicity als Parameter.

Komplexe Reflexionen gehen ja Richtung Environment-Mapping, also hab ich damit angefangen.

Frage 1: Benutzt man noch Cube-Maps? Die sind nervig, weil ich sie intern anders anlegen muss, als herkömmliche Texturen, ich habe auch 6 statt 1 Datei, brauche ein konsistentes Namensschema, und all so Kram. Die Alternative wäre Longitude/Latitude-Projektion (oder wie auch immer man das nennt), also das, was man z.B. bei den Polyhaven HDRs Standardmäßig bekommt. Ich kann aus einem 3D Richtungsvektor recht unproblematisch die Texturkoordinaten berechnen, nicht so effizient wie beim Cube-Mapping, aber vermutlich spielt das keine Rolle. Wegen der Pole ist wohl auch die Pixeldichte weniger effizient, aber dafür ist die Handhabung so super bequem.

Das Problem ist nun, dass man die BRDF ja pro Lichtrichtung auswerten muss, also in der Regel einmal für die Sonne. Physikalisch korrekt wäre es nun, die BRDF für jeden Pixel der Environment-Map auszuwerten und alles zu addieren, was natürlich viel zu teuer ist. Es gibt gewiss sehr clevere Methoden das effizient anzunähern, aber naja, ich will nicht viel mehr als 1-2 Tage hierauf verwenden. Also wird es auf irgendeinen unphysikalischen Hack hinauslaufen, muss ja nur gut aussehen. Hier also der Code:

Code: Alles auswählen

vec3 desaturate(vec3 color, float factor)
{
	vec3 lum = vec3(0.299, 0.587, 0.114);
	vec3 gray = vec3(dot(lum, color));
	return mix(color, gray, factor);
}

.....

(1)	vec3 custom_normal = mix(normalize(mesh_normal), normal_map, 0.4);
(2)	vec3 reflected = reflect(view_direction_world, custom_normal );
(3)	vec2 ref_uv = direction_to_long_lat(reflected);
(4)	vec3 reflection_color = desaturate(texture(environment_map, ref_uv).rgb, 0.9);
(5)	color_output *= vec4(0.85) + vec4(pow(reflection_color, vec3(2.0)), 0)*0.5;
- Ich habe mich entschieden, die BRDF mit der Sonne und allem zunächst ganz normal auszuwerten, und die Reflexion später irgendwie reinzurechnen. Ich dachte erst, ich könnte ja vlt. einfach die Farbe für das Spekular-Highlight aus der Environment-Map laden, aber dann hab ich ja nur Reflexion in eine Richtung und nicht in alle. Also sehe ich keine vernünftige Möglichkeit die Reflexion direkt in die BRDF einzubauen, also kommt sie später unphysikalisch dazu.

- Das Modell hat eine Normalmap. Verwende ich diese direkt, ist die Reflexion des Himmels sehr hochfrequent, man sieht viel Gegrissel aber keine Wolkenformen mehr. Ich wollte aber gerne, dass man auf einer großen, geraden Dachfläche an verschiedenen Stellen verschiedene Strukturen sieht (sieht man im Video leicht), also interpoliere ich zwischen der Mesh-Normalen und der Normal-Map (Zeile 1). Effektiv verringert sich damit der Einfluss der Normalmap und ich sehe größere Details.

- Dann berechne ich ganz normal die Reflexion und die Texturkoordinate (Zeile 2-3).

- Die Colormap vom Dach ist grünlich, reflektiere ich blauen Himmel ergibt sich eine starke Farbverschiebung. Ich hätte jetzt entsprechend die Colormap anpassen können, aber natürlich hängt das auch von der verwendeten Environment-Map ab, und physikalisch korrekt ist es eh schon nicht mehr. Stattdessen hab ich die Reflexionsfarbe desaturiert (Zeile 4), somit ändert sich die Helligkeit, aber nicht die Farbe. Aktuell steht der Faktor auf 0.9, d.h. fast komplett Graustufen. Damit ist der Farbstich Geschichte.

- Erst hab ich die Reflexion addiert (Intuition: Ist ja zusätzliches Licht). Das wurde zu hell. Ich kann die ursprüngliche Farbe vorher abdunkeln, um die Helligkeit auszugleichen. In beiden Fällen addiere ich aber im Wesentlichen Grau, das ganze Dach sieht damit irgendwie entsättigt aus. Stattdessen Multipliziere ich die Farben jetzt (Zeile 5). Dadurch bleibt das Grün knallig und man hat einen angenehmen Kontrast. Physikalisch kann ich das aber nicht rechtfertigen :D

Frage 2: Was kann ich hier noch ändern, bzw. besser machen?

Ich denke, man könnte Bloom und HDR einbauen. Das würde aber die gesamte Szene betreffen und meine Pipeline ist aktuell nicht darauf ausgelegt. Ich könnte vermutlich auch eine Roughness-Map verwenden, allerdings sieht man den Dom halt meistens als ein Gebäude von vielen, das man so weit reinzoomt, dass man einzelne Schindeln gut erkennt, passiert selten, und es soll halt Hauptsächlich aus der Standardansicht gut aussehen. Mal sehen.

Zum Abschluss aber doch nochmal eine Detailansicht, in der man gut die einzelnen Wolken erkennt.
2025-04-27_17-57-05_Modelviewer.jpg

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 18:41
von Matthias Gubisch
Kurze Antwort zu den cubemaps:
Ja man nutzt noch cubemaps
Der Gründe dafür gibt es zwei die mir spontan einfallen:
1. Das Sampling ist viel schneller weil es kein sin/cos, usw benötigt um die texturkoordinaten zu berechnen
2. Man kann Environment maps relativ gut dynamisch erzeugen.
Wenn die aber die perf nicht wehtut spielt das keine rolle

Zu dem anderen Teil kann ich morgen wenn ich am Rechner bin mehr schreiben, ich verwende bei mir auch die frostbyte brdf. Aber am Handy ist mir das zu kompliziert
Interessant wäre welche Version du nutzt?

PS: ich nehme an der Artikel ist bekannt:
https://learnopengl.com/PBR/Theory

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 20:32
von Krishty
Matthias Gubisch hat geschrieben: 27.04.2025, 18:41 https://learnopengl.com/PBR/Theory
Kann ich auch nur empfehlen. Was Cubemaps betrifft: Ich habe sie unter Direct3D nie zufriedenstellend ans Laufen gekriegt, weil mir GL_TEXTURE_CUBE_MAP_SEAMLESS fehlt. Damit filtert D3D nicht über die Kanten von Cubemaps hinaus. Die Artefakte sind IIRC in einem späteren Kapitel des obigen Artikels abgebildet.

Als ich das letzte Mal mit der Frage konfrontiert war, kam ich zum Schluss, dass Spherical Harmonics die performanteste Methode für Environment Mapping sind. Aber der Aufwand war so hoch, dass ich sie nie implementiert habe.

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 20:56
von Schrompf
Ich habe SHs vor langer Zeit mal implementiert, ohne sie verstanden zu haben, und ich kann sagen, dass man für solche Effekte so hohe SH-Level bräuchte, dass Du auch einfach ne Textur nehmen kannst. Und da ist ne CubeMap ne simple Sache, aus ner DDS oder so kannst Du die auch direkt laden. Aber wenn es Dich stört, dann nimm doch ne einfache 2D-Textur und sample mit reflected.xz oder so. Also mit den beiden Boden-Koordinaten, ohne den Hoch-Vektor. Dann samplest Du nen Kreis rund um die Mitte der Textur. Für bessere Verteilung kannst Du noch quadrieren vorher, dann bist Du fast bei ner Gleichverteilung der Texel aufm Halbkreis, soweit das bei Kugel->2D überhaupt geht.

Und in dieser Textur nimmst Du halt Wolken, Sonne, sowas, aber so ein bissl weichgezeichnet.

PBR wollte ich mir immer mal angucken, hab ich aber noch nicht, geb ich zu. Ich vermute, dass Du mit ner simplen Addition der Specular halt die Energieerhaltung verletzt. Das, was über die Specular reinkommt, müsste halt vorher bei der Diffus fehlen, damit es wieder in Summe <1 ergibt. Vielleicht kannst Du ja einfach den Durchschnitt der ReflectionMap berechnen und von der Diffus abziehen. Irgendwie so.

Man merkt schon, ich kann nur Wischiwaschi und Vorzeichen-Streuer, bis es passt.

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 21:27
von Krishty
Schrompf hat geschrieben: 27.04.2025, 20:56PBR wollte ich mir immer mal angucken, hab ich aber noch nicht, geb ich zu. Ich vermute, dass Du mit ner simplen Addition der Specular halt die Energieerhaltung verletzt. Das, was über die Specular reinkommt, müsste halt vorher bei der Diffus fehlen, damit es wieder in Summe <1 ergibt. Vielleicht kannst Du ja einfach den Durchschnitt der ReflectionMap berechnen und von der Diffus abziehen. Irgendwie so.
lerp(diffuse.rgb, specular.rgb, fresnel) – irgendwo bei StackOverflow ist eine Erklärung, dass das schon klar geht. Fresnel gibt ja quasi das Verhältnis von Brechung zu Reflexion an. Funktioniert bei mir ganz gut.

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 22:06
von Jonathan
Matthias Gubisch hat geschrieben: 27.04.2025, 18:41 PS: ich nehme an der Artikel ist bekannt:
https://learnopengl.com/PBR/Theory
Dieser spezielle Artikel nicht, aber ich bin ihn überflogen und nichts davon kam mir irgendwie neu oder unbekannt vor. Ich habe aber unter anderem große Teile von "Physically Based Rendering: From Theory To Implementation" gelesen.
Matthias Gubisch hat geschrieben: 27.04.2025, 18:41 1. Das Sampling ist viel schneller weil es kein sin/cos, usw benötigt um die texturkoordinaten zu berechnen
Ein befreundeter Echtzeitgrafikforscher hat mir mal in einem langen Vortrag erklärt, dass heutzutage in der Regel Bandbreite und nicht Shaderinstruktionen das Nadelöhr ist. Hab damals keine zweite Meinung eingeholt, klang aber ziemlich korrekt. Die Texturkoordinate krieg ich ja mit einem Sinus und einem Tangens pro Pixel, von daher mache ich mir da keine Sorgen. Vermutlich würde ich sogar mehr erreichen, wenn ich einfach die Textur runterskalieren würde.
Krishty hat geschrieben: 27.04.2025, 20:32 Als ich das letzte Mal mit der Frage konfrontiert war, kam ich zum Schluss, dass Spherical Harmonics die performanteste Methode für Environment Mapping sind. Aber der Aufwand war so hoch, dass ich sie nie implementiert habe.
Ich meine, das ist einfach mehr Rechnen und weniger Speicherzugriff im Vergleich zu einem simplen Texture-Lookup, und deswegen ist es schneller? Oder was genau ist das Argument?
Jonathan hat geschrieben: 27.04.2025, 17:03 Es gibt gewiss sehr clevere Methoden das effizient anzunähern,
Das ging so ein bisschen in die Richtung: Ich hab irgendwann mal etwas darüber gehört, aber schon wieder vergessen, aber es läuft vermutlich auf etwas Vergleichbares heraus wie die Faltung von SH und BRDF analytisch lösen um damit eine Approximation dessen zu bekommen, was man korrekt bekommen würde, hätte man die BRDF mit jedem Pixel der Environmentmap ausgewertet. Ich meine mich auch dunkel zu erinnern, dass einige Global-Illumination Methoden ähnlich arbeiten: Man speichert SH basiert das Licht, das aus allen Richtungen kommt in light-probes und kann aufgrund dieser Darstellung einerseits light-probes effizient inerpolieren und andererseits das Shading für alle einfallenden Richtung gleichzeitig ausrechnen.

Aber, nunja, das wäre sicherlich viel Arbeit. Und mein Ziel ist es aktuell, dass ein Material an einer Stelle der Szene schick ausschaut, da muss nix auf irgendetwas gut verallgemeinern oder sonst irgendwie "richtig" sein, von daher hab ich nichts gegen einen dreckigen Trick, der Tage an Zeit einspart ;)
Schrompf hat geschrieben: 27.04.2025, 20:56 PBR wollte ich mir immer mal angucken, hab ich aber noch nicht, geb ich zu. Ich vermute, dass Du mit ner simplen Addition der Specular halt die Energieerhaltung verletzt.
Ja, aber ist mir an dieser Stelle tatsächlich egal. Energieerhaltung ist halt z.B. toll für Pathtracing, weil dann garantiert ist, das es konvergiert, weil das Licht halt immer weiter abnimmt (oder in seltenen Extremfällen maximal mal konstant bleibt). Aber bei mir kommt da ja nichts mehr, ich berechne einfach den Bildschirmpixel. Ist der zu hell, mach ich ihn halt dunkler, und kann behaupten, das käme von irgendwelchen Materialeigenschaften (ka, Albedo oder so). Es muss ja mit nichts konsistent sein, ist also quasi ein unterbestimmtes System und damit gibt es vermutlich immer eine theoretische Möglichkeit mit einem tatsächlich physikalischen Modell das selbe Ergebnis erzielt zu haben. Wenn man das Philosophieren denn so weit treiben will :D
Krishty hat geschrieben: 27.04.2025, 21:27 lerp(diffuse.rgb, specular.rgb, fresnel) – irgendwo bei StackOverflow ist eine Erklärung, dass das schon klar geht. Fresnel gibt ja quasi das Verhältnis von Brechung zu Reflexion an. Funktioniert bei mir ganz gut.
Ich meine, klar, vermutlich kann man damit recht leicht Energieerhaltung erzwingen. Tatsächlich bin ich aber damals hauptsächlich auf diese Frostbite-BRDF gewechselt, weil ich mehr Kontrolle über die Form der Highlights haben wollte, nicht weil Energieerhaltung meine Hauptmotivation war.

Der Code den ich benutze:

Code: Alles auswählen


// All information about a shading point that is needed to perform shading using world space coordinates
struct shading_data_t
{
	// vec3 position; // The position of the shading point in world space
	vec3 normal; // The normalized world space shading normal
	vec3 outgoing; // The normalized world-space direction towards the eye (or the outgoing light direction if global illumination is considered)
	float lambert_outgoing;// dot(normal, outgoing)
	vec3 diffuse_albedo; // The RGB diffuse albedo. Dependent on the BRDF an additional direction-dependent factor may come on top of that
	vec3 fresnel_0; // The color of specular reflection at zero degrees inclination
	float roughness; // Roughness coefficient for the GGX distribution of normals
};


// An implementation of the Schlick approximation for the Fresnel term.
vec3 fresnel_schlick(vec3 fresnel_0, vec3 fresnel_90, float cos_theta)
{
	float flipped = 1.0f - cos_theta;
	float flipped_squared = flipped * flipped;
	return fresnel_0 + (fresnel_90 - fresnel_0) * (flipped_squared * flipped * flipped_squared);
}


/*! Evaluates the full BRDF with both diffuse and specular terms (unless they
	are disabled by the given booleans). The diffuse BRDF is Disney diffuse.
	The specular BRDF is Frostbite specular, i.e. a microfacet BRDF with GGX
	normal distribution function, Smith masking-shadowing function and Fresnel-
	Schlick approximation. The material model as a whole, agrees with the model
	proposed for Frostbite:
	https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
	https://dl.acm.org/doi/abs/10.1145/2614028.2615431 */
vec3 frostbite_brdf(shading_data_t data, vec3 incoming_light_direction)
{
	// A few computations are shared between diffuse and specular evaluation
	vec3 half_vector = normalize(incoming_light_direction + data.outgoing);
	float lambert_incoming = dot(data.normal, incoming_light_direction);
	float outgoing_dot_half = dot(data.outgoing, half_vector);
	vec3 brdf = vec3(0.0f);
	
	// check visibility:
	if(lambert_incoming <= 0)
		return vec3(0.0);
	
	// Disney diffuse BRDF
	if(true)
	{
		float fresnel_90 = fma(outgoing_dot_half * outgoing_dot_half, 2.0f * data.roughness, 0.5f);
		float fresnel_product =
			fresnel_schlick(vec3(1.0f), vec3(fresnel_90), data.lambert_outgoing).x
			* fresnel_schlick(vec3(1.0f), vec3(fresnel_90), lambert_incoming).x;
		brdf += fresnel_product * data.diffuse_albedo;
	}
	
	// Frostbite specular BRDF
	if(true)
	{
		float normal_dot_half = dot(data.normal, half_vector);
		// Evaluate the GGX normal distribution function
		float roughness_squared = data.roughness * data.roughness;
		float ggx = fma(fma(normal_dot_half, roughness_squared, -normal_dot_half), normal_dot_half, 1.0f);
		ggx = roughness_squared / (ggx * ggx);
		// Evaluate the Smith masking-shadowing function
		float masking = lambert_incoming * sqrt(fma(fma(-data.lambert_outgoing, roughness_squared, data.lambert_outgoing), data.lambert_outgoing, roughness_squared));
		float shadowing = data.lambert_outgoing * sqrt(fma(fma(-lambert_incoming, roughness_squared, lambert_incoming), lambert_incoming, roughness_squared));
		float smith = 0.5f / (masking + shadowing);
		// Evaluate the Fresnel term and put it all together
		vec3 fresnel = fresnel_schlick(data.fresnel_0, vec3(1.0f), clamp(outgoing_dot_half, 0.0f, 1.0f));
		brdf += ggx * smith * fresnel;
	}
	return brdf * M_INV_PI * dot(incoming_light_direction, data.normal);
}
Witzigerweise werden da diffuse und specular separat berechnet und dann einfach addiert. Ich habe mir die Herleitung nicht angeschaut, würde aber fast davon ausgehen, dass es dennoch energieerhaltend ist (zum Beispiel könnte der specular-Term außerhalb des Highlights ja einfach negativ sein, d.h. insgesamt zu 0 integrieren).

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 22:17
von Jonathan
Falls sich das mal jemand anschauen will, hier der Viewer + Modell:

https://jonathank.de/games/landvogt/dow ... lviewer.7z

Zur Verwendung:
- ggf. einmal "Menu->Delete History" machen, ich glaube da ist ein absoluter Pfad von meinem System im Download gelandet.
- Über "Open" oder mit drag and drop die Cathedral/cathedral.gltf Datei laden
- Kamera wird per linke/rechte Maustaste gesteuert.
- Das Modell lädt ohne Reflexionen, die müssen erst aktiviert werden. Über "Model Info" das "Roofing Tiles" Material auswählen und dort auf "Add Reflexion" klicken.
- Unter "Light" kann man "Light from Camera" klicken, oder "Light follows Camera" umschalten.
- Ebenfalls unter Model-Info kann man sich die Shader anzeigen lassen.

Um die Shader zu editieren: Die entsprechenden Textdateien liegen im "shader" Unterordner, diese muss man ändern und dann im Viewer auf "Reload Shader" klicken. Es gibt ein Grundgerüst (brdf_shadow.fs) und mehrere Componenten. Dieser werden unter Modelinfo aufgelistet und man sieht sie auch sofort, wenn man im Viewer den Shader-Code anschaut (einfach die Kommentare lesen). Der relevante Code liegt in "reflection.shader", der dann an unterschiedlichen Stellen in das Skelett eingefügt wird. Aber für den Anfang kann man dort z.B. die Konstanten ändern, speichern, und im Viewer aktualisieren.

Man kann auch Shader-Komponenten deaktivieren, etwa Normalmapping. Dabei wird der Shader neu erstellt und die Reflexion wieder gelöscht, man muss sie also neu hinzufügen (aber nur 1 mal!). Ein "Reload Model" funktioniert ähnlich, damit kann man Reflexionen deaktivieren. (Ist halt ein kleiner Hack um dieses eine spezielle Material heute mal zu testen).

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 22:29
von Krishty
Jonathan hat geschrieben: 27.04.2025, 22:06
Matthias Gubisch hat geschrieben: 27.04.2025, 18:41 1. Das Sampling ist viel schneller weil es kein sin/cos, usw benötigt um die texturkoordinaten zu berechnen
Ein befreundeter Echtzeitgrafikforscher hat mir mal in einem langen Vortrag erklärt, dass heutzutage in der Regel Bandbreite und nicht Shaderinstruktionen das Nadelöhr ist. Hab damals keine zweite Meinung eingeholt, klang aber ziemlich korrekt. Die Texturkoordinate krieg ich ja mit einem Sinus und einem Tangens pro Pixel, von daher mache ich mir da keine Sorgen. Vermutlich würde ich sogar mehr erreichen, wenn ich einfach die Textur runterskalieren würde.
Stimme völlig zu – wenn man die Wahl zwischen ALU und Speicher hat, ist ALU immer die bessere Wahl. Hier sind wir aber wahrscheinlich total in einem Edge Case, weil deine Environment Map gut in den Cache der Hardware passen könnte (ist ja nicht die Art 4k-Textur, mit der sich GPUs sonst rumschlagen).

Übrigens brauchen Texturzugriffe ebenfalls ALU – irgendwie muss das Zeug ja interpoliert werden, und von sRGB nach linear konvertiert werden, usw.
Jonathan hat geschrieben: 27.04.2025, 22:06
Krishty hat geschrieben: 27.04.2025, 20:32 Als ich das letzte Mal mit der Frage konfrontiert war, kam ich zum Schluss, dass Spherical Harmonics die performanteste Methode für Environment Mapping sind. Aber der Aufwand war so hoch, dass ich sie nie implementiert habe.
Ich meine, das ist einfach mehr Rechnen und weniger Speicherzugriff im Vergleich zu einem simplen Texture-Lookup, und deswegen ist es schneller? Oder was genau ist das Argument?
Es sind weniger Speicherzugriffe und die Berechnung selber ist auch sehr kurz und GPU-freundlich.
Schrompf hat geschrieben: 27.04.2025, 20:56 Ich habe SHs vor langer Zeit mal implementiert, ohne sie verstanden zu haben, und ich kann sagen, dass man für solche Effekte so hohe SH-Level bräuchte, dass Du auch einfach ne Textur nehmen kannst. Und da ist ne CubeMap ne simple Sache, aus ner DDS oder so kannst Du die auch direkt laden.
Ich könnte mich irren, aber: Macht man SH nicht eher pro Vertex um die lokale Umgebung abzubilden? Klar brauchst du für scharfe Reflexionen in Spiegel-Qualität Ordnung 30 oder so, aber das ist noch immer bedeutend weniger als eine komplette Cube Map pro Vertex. Zumal die Koeffizienten ja gut in 8-Bit-Werten komprimierbar sind. Wenn wir von einem globalen SH für die gesamte Umgebung sind, sind das immernoch “nur” Hundert Shader-Konstanten anstatt einer kompletten Textur. Nicht, dass man das machen sollte – aber die räumliche Kompression von SH ist durchaus beeindruckend.

Edit: Hier ist ein Beispiel, wie hoch man mit SH gehen muss. Jetzt kriege ich wieder richtig Bock, an sowas zu werkeln …

Ach ja, um auf die Ausgangsfrage zurück zu kommen: In deinem Beispiel kann ich nicht genau sagen, wo der Schuh drückt. Alles sieht mir zu hell und zu kontrastlos aus, aber die Stärke des Sonnenlichts im Vergleich zu Schatten scheint richtig zu sein. Höhere Mip-Levels des Daches sollten insgesamt rauer werden (weil die Details der Dachziegel aus hinreichender Distanz zu Microfacets werden), aber das ist ein Detail und sollte keinen entscheidenden Unterschied im Aussehen machen. Was ist denn dein Gamma?

In meinem Zeug ist lokale Verdeckung das große Problem (dass du in der Spiegelung nur die Environment Map siehst, aber nicht den gespiegelten Turm, der den gespiegelten Himmel verdecken sollte). Deshalb lese ich auch gespannt mit, was hier noch für Vorschläge kommen :)

Re: Fancy Reflexionen

Verfasst: 27.04.2025, 23:52
von scheichs
Importier doch mal den Dom in Unity oder Unreal vergleiche wie es da ausschaut und an welchen Parametern man drehen könnte? HDR/PBR/Postprocessing...
Abseits dessen find ich ihn schon ziemlich nice!

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 00:12
von Matthias Gubisch
Ich finde die Diskussion über Spheric Harmonics gerade auch sehr Interessant.
Da ich das aber auch noch nie selber gemacht habe, vielleicht kann mich mal jemand Aufklären ob ich da ein Verständnissproblem habe.

Ausgehend von "Standard" IBL, hat man ja 2 Cubemaps, Specular und Diffuse.
Specular sorgt ja größtenteils für die Reflexionen, während Diffuse das Umgebungslicht repäsentiert, vereinfacht ausgedrückt...
Für erstere verwendet man heutzutage meines Wissens entweder immer noch Cubemaps oder Raytracing, Zweiteres wird lässt ich mit Spheric Harmonics gut darstellen und spart Memory Bandbreite auf kosten von Rechenzeit, kann natülich auch per Raytracing gemacht werden.

Vielleicht kann hier jemand mal mein Halbwissen entweder Richtigstellen oder Bestätigen

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 07:23
von Jonathan
Krishty hat geschrieben: 27.04.2025, 22:29Ich könnte mich irren, aber: Macht man SH nicht eher pro Vertex um die lokale Umgebung abzubilden?
Ahh, verstehe, du redest von, uhm, "lokalen Reflexionen", sprich der linke Turm spiegelt sich im rechten. Das wäre natürlich cool, aber so fancy wollte ich es dann gar nicht treiben. Eine Pipeline aufbauen um die Umgebung pro Vertex zu rendern und als SH abzuspeichern - ufff.

Tatsächlich kommt meine Motivation glaube ich von einem der neueren Tomb Raider spielen. Ihr wisst schon, da wo man alte Artefakte finden kann und dann in einem extra Fenster von allen Seiten betrachten kann. Die haben da echt hübsch funkelndes Gold und Edelsteine. Ungefähr so:
2025-04-28_08-10-31_SOTTR.mp4
(7.18 MiB) 14-mal heruntergeladen
Oder wie der Bogen in diesem Video. Der glitzert richtig in der Sonne und wenn er sich dreht funkeln immer andere Stellen: https://www.youtube.com/watch?v=nVuDmnNuNak&t=326s

Wenn ich mir das so anschaue... Mir scheint, dass dieses Artefakt vor allen Dingen sehr passende Normal- und Roughness-Maps hat? Der Bogen hat definitiv eine ordentliche Ladung Bloom, aber dafür wird es wohl auch HDR brauchen: Ein paar sehr kleine Stellen haben eine direkte, spekulare Reflexion und sind dadurch um Größenordnungen heller als alles andere, durch das Bloom-Weichzeichnen sieht man dann diesen diffusen, großen Glanz, der gar nicht mehr so hell ist. Ohne HDR hat man vermutlich Bloom an viel zu vielen Stellen und es sieht kitschig aus.
scheichs hat geschrieben: 27.04.2025, 23:52 Abseits dessen find ich ihn schon ziemlich nice!
Danke :) Ich frage mich tatsächlich auch ein wenig, was eigentlich meine Erwartung sein sollte. Ein Artefakt in Großansicht ist halt irgendwie etwas anderes, als ein Gebäude aus der Vogelperspektive. Schaut man sich noch einmal das Artefaktvideo an, dann scheint es in einem Raum mit 3 großen Fenstern / Lichtquellen zu sein. Natürlich sind dann beim Drehen manchmal manche Seiten komplett hell und andere viel dunkler, was sehr interessant aussieht. Aber mein Dach muss ja irgendwie den Himmel reflektieren, der halt einfach in jede Richtung hell ist (und in eine Richtung super hell).
Krishty hat geschrieben: 27.04.2025, 22:29Alles sieht mir zu hell und zu kontrastlos aus, aber die Stärke des Sonnenlichts im Vergleich zu Schatten scheint richtig zu sein.
Liegt das vielleicht auch am Hintergrund? Das ist halt einfach eine Heightmap mit unpassenden Material (der spekulare Glanz und seine Form scheint mir doch sehr suspekt für eine Wiese). Im Spiel selber hätte man dann aber ja Bäume und Gebäude, mit vielen anders ausgerichteten Oberflächen, dann hat die Szene automatisch insgesamt mehr Kontrast.

Aber wo wir beim Thema Shading sind: Aktuell hab ich ein direktionales Sonnenlicht und einen konstanten Ambienten Term. Ich habe überlegt letzteren durch ein direktionales Gegenlicht zu tauschen. Macht in echt nicht wirklich Sinn, aber aktuell hat halt alles was im Schatten ist genau 0 Shading, mit Gegenlicht wären anders Orientierte Oberflächen zumindest leicht unterschiedlich und man könnte es als sehr schlechte Approximation von Globaler Beleuchtung sehen (indirektes Licht hat schließlich auch eine Richtung...)

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 08:45
von Alexander Kornrumpf
Jonathan hat geschrieben: 27.04.2025, 17:03 dieses typisch grün-blaue Kufperdach. In echt sieht es eher matt aus, aber es geht mir ja um schicke Optik und nicht um Realismus, also muss es funkeln.

[...]

Zum Abschluss aber doch nochmal eine Detailansicht, in der man gut die einzelnen Wolken erkennt.
2025-04-27_17-57-05_Modelviewer.jpg
Du willst das nicht hören, aber du optimierst am falschen Ende. Es sieht aus wie Plastik, weil Kupferdächer halt nicht so aussehen und das richtig zu machen wäre für den visuellen Eindruck viel viel wichtiger als "fancy Reflexionen".

Referenzbild: https://www.faz.net/aktuell/feuilleton/ ... 57027.html

Potsdamer Schloss deshalb weil das Dach, als das Foto aufgenommen wurde noch relativ neu war (famously ein "Geschenk" von Hasso Plattner). In deinem Scenario passt das, ich hätte gesagt über die Jahre wird die Patina eher noch grauer.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 08:54
von joeydee
mein Halbwissen
Dann werfe ich mein Halbwissen zu SHs auch einfach mal in den Ring.

Spherical Harmonics kann man erstmal "nur" als ein Kompressionsalgo wie JPG betrachten, nur direkt für die Kugeloberfläche. Environment Maps und SHs sind daher technisch betrachtet beide Sampler Lookups auf die Frage "welches Licht kommt aus welcher Richtung". Sind beide qualitativ gleich, gibts auch gleiche Ergebnisse.
SH können natürlich von Haus aus hohe Beleuchtungswerte (HDR), Cubemaps sollte man daher auch mit HDRIs bestücken, um das vergleichbar zu halten.
Da SHs geringer Order (high compression, low quality) natürlich extrem billig sind, und das Bild dabei wie weichgezeichnet ist, eignen sich diese natürlich sehr gut/günstig als Diffuse-Lookup. I.d.R. nimmt man die Version mit 9 Koeffizienten (4. Order?), nach mathematischen Vergleichen ist die sehr nah an der echten diffusen Beleuchtung einer mattweißen Kugel.
An der Stelle kann man auch einfache Lightprobes mit 6 Koeffizienten verwenden (rundum eintreffendes Licht in den 6 Achsenrichtungen Dot-gewichtet sampeln), die sind mathematisch etwas weiter weg, aber optisch immer noch sehr nah dran.

Cubemaps haben natürlich noch den Vorteil, dass sie von der Graka sehr einfach live erstellt werden können; SHs muss man erst sampeln.
Hat man die Specular-Cubemap sowieso aufgenommen, ist es vermutlich günstiger, diese mit SHs zu sampeln und dabei gleich den Weichzeichner geschenkt zu bekommen, statt eine zwite Cubemap aufzumachen und über Grenzen mehrfach weichzeichnen zu müssen.

Also ja, es dürfte sicher Anwendungen geben, die vor allem aus diesen Gründen SHs für max. Roughness und Cubemaps für min. Roughness im gleichen Materialshader verwenden.



Nun aber nochmal zur Eingangsfrage, nach etwas metallisch wirkendem Bling-Bling.
Natürlich kann man mit eine Specular-Cubemap leicht Hochglanz reinrechnen. Das wirkt dann entweder wie Chromspiegel, oder Glanzlack, je nach Verrechnung. Im geposteten Bild wirkt es wie Glanzlack, wo man "gut die einzelnen Wolken erkennt" - soll es nachMetalldach aussehen, sollte man die nicht erkennen, wie ich finde.
Für einen natürlicheren Metall-Look bevorzuge ich persönlich daher immer einen Roughness-Faktor. D.h. es wird irgendwo ein Sampler zwischen dem reinen Diffuse- und reinen Specular-Lookup benötigt - natürlich kann man die beiden Grenzfälle nicht einfach so interpolieren/blenden, sondern man benötigt einen eigenen Sampler mit entsprechend passender Weichzeichnung. Also eigentlich eine ganze Reihe davon, will man Roughness flexibel halten, die kann man dann besser interpolieren. (Welche Optimierungstechniken dafür genau im Einsatz sind, bin ich überfragt).

So eine Pipeline habe ich noch nicht in Eigenregie aufgebaut - was ich aber schon gemacht habe: Mit dem Reflection-Vektor einfach nur in den Diffuse-Sampler geschaut. Bei mir war das die o.G. Cube-Probe, aber das ist davon unabhängig, geht natürlich genauso mit SHs oder entsprechend weichgezeichneter Cubemap.
Jedenfalls völlig ohne Specular-Sampler. Das ist dann metallisch mit höchster Roughness. Vielleicht reicht das ja schon. Ist natürlich der einfachste/billigste Hack, und hat nur wenig Varianz im Sampler.
Leider kein Bild aus der aktuellen Engine, dafür mal schnell mit Blender simuliert. Vlnr: Diffuse-Lookup (matt), Diffuse+Specular Lookup (Lack), Metallic-Verrechnung (poliertes Metall), Diffuse-Sampler mit Specular-Vektor-Lookup (mattes Metall) (hier nur simuliert, sieht dann ungefähr so aus). Nicht im Bild: Auf das letzte nochmal den Specular-Lookup, dann bekäme man typischen Metallic-Autolack.
Bild
EDIT: Das oben war ein Cycles-Render. Unten nochmal in Eevee, macht ja mehr Sinn darin zu experimentieren.
Bild

Mein Tipp daher: Du kennst dich doch in Blender aus. Mach dort ein hübsches Material, und überlege dann mit welcher Technik du den Look in deine Engine portieren kannst, und welche Maps du dafür überhaupt benötigst.
Und schau natürlich, dass deine Environment-Maps genügend Varianz und Kontrast haben, damit es da genug Lichtspiel gibt. In der Fotografie nimmt man bei reflektierenden Objekten im Studio dafür extra Masken vor die Lampen, damit mehr Muster entstehen.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 08:56
von Krishty
Deine Reflexionen sehen viel zu stark bei schwachem Einfallswinkel aus:

Bild

Vergleiche:

Bild

Du scheinst dich in der Region von blank poliertem Kupfer zu bewegen. Was möchtest du denn darstellen? Kupfercarbonat à Freiheitsstatue ist matt (weil dielektrisch) und dürfte bei diesem Einfallswinkel höchstens 2–10 % des Himmels reflektieren. Gold wie in deinem Artefaktvideo reflektiert mehr, hat dafür aber so gut wie kein Diffuse (weil es elektrisch leitend ist).

Dein Dach scheint beides zu sein – stark diffus, aber auch hoch reflektierend – und sieht dann eher wie dünn angemaltes Metall aus?
Alexander Kornrumpf hat geschrieben: 28.04.2025, 08:45Du willst das nicht hören, aber du optimierst am falschen Ende. Es sieht aus wie Plastik, weil Kupferdächer halt nicht so aussehen und das richtig zu machen wäre für den visuellen Eindruck viel viel wichtiger als "fancy Reflexionen".
💯! Jonathan, wie soll das Dach denn nun aussehen? Mich bringen mich die ganzen Referenzen zu goldenen Artefakten und funkelnden Bögen durcheinander …

Was joeydee über SH sagt, kann ich auch nur bestätigen.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:13
von Matthias Gubisch
joeydee hat geschrieben: 28.04.2025, 08:54
mein Halbwissen
Für einen natürlicheren Metall-Look bevorzuge ich persönlich daher immer einen Roughness-Faktor. D.h. es wird irgendwo ein Sampler zwischen dem reinen Diffuse- und reinen Specular-Lookup benötigt - natürlich kann man die beiden Grenzfälle nicht einfach so interpolieren/blenden, sondern man benötigt einen eigenen Sampler mit entsprechend passender Weichzeichnung. Also eigentlich eine ganze Reihe davon, will man Roughness flexibel halten, die kann man dann besser interpolieren. (Welche Optimierungstechniken dafür genau im Einsatz sind, bin ich überfragt).
Thema Optimierungstechniken:
Ich mache das mit einer MipChain der Specular Cubemap, Je nach Roughness factor wird zwischen 2 MipLevels entsprechend geblended. Vorteil hier ist dass das die TextureUnit für mich machen kann und ich das nicht selber machen muss ;)
Klappt bisher ganz gut. Ob es hier mehr State of the Art Techniken gibt weis ich nicht. War zumindest so als ich das vor >5 Jahren zum ersten mal implementiert habe und hab mich seitdem nicht mehr so richtig damit beschäftigt das zu optimieren, da es läuft und auch ganz performant zu sein scheint.

Eingangsfrage Kupferdachlook
Im prinzip hat joeydee da schon ganz gut Beschrieben, und auch ansonsten wurde mittlerweile schon viel geschrieben und erklärt so dass ich mich doch kürzer als gedacht halten kann.
Kupfer ist ein Metall also Metallness auf 1.0
Specular EnvMap als SH(bin mir immer noch nicht sicher ob das geht) oder Cubemap (mit MipChains) basierend auf der Roughness samplen und als Ambient-Term in die BRDF einrechnen.
Dann solltest du durch spielen mit dem Roughness-Faktor ein gutes Ergebniss erziehlen können.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:18
von Alexander Kornrumpf
Matthias Gubisch hat geschrieben: 28.04.2025, 09:13 Kupfer ist ein Metall also Metallness auf 1.0
Kupfer (Cu) bekommst du an der frischen Luft (Dach) aber nicht zu sehen. Was du siehst ist irgendein Oxid (Umgangssprachlich "Patina", Krishty hatte oben Wikipedia verlinkt) und das ist kein Metall und sieht auch nicht aus wie ein Metall. Und das ist dann schon ein Problem.

Poliertes Kupfer zum Vergleich: https://www.dreher.at/brauanlagen/sudwerke/

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:29
von joeydee
Das weiß Jonathan doch selbst ;) braucht man glaube ich nicht mehr erwähnen.
Aus dem Eingangspost:
Jonathan hat geschrieben: 27.04.2025, 17:03 In echt sieht es eher matt aus, aber es geht mir ja um schicke Optik und nicht um Realismus, also muss es funkeln.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:33
von Alexander Kornrumpf
Ich weiß dass er es weiß, ich hatte den Teil des Eingangsposts auch zitiert als ich meinen Einwand erstmalig vorbrachte, aber die Entscheidung ist falsch. Reflektionen werden in einem Material das in echt viel weniger reflektiert nie gut aussehen, egal wie "fancy" sie sind. Aus Falschem folgt bekanntlich Beliebiges.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:40
von Krishty
Naja … er könnte blank poliertes Kupfercarbonat wählen. Dann müsste er aber die Metalness runtergedreht lassen. Wäre dann wie die zweite Kugel in joeydees Beispiel.

Sieht dann auch eher fancy aus im selben Sinne wie Donald Trumps Büro edel aussieht.

(Aber vielleicht sieht es auch ganz toll aus – bei Grafikprogrammierung ohne konsistentes Materialmodell geht Probieren über Diskutieren 🤷)

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:51
von Alexander Kornrumpf
Krishty hat geschrieben: 28.04.2025, 09:40 Naja … er könnte blank poliertes Kupfercarbonat wählen. Dann müsste er aber die Metalness runtergedreht lassen. Wäre dann wie die zweite Kugel in joeydees Beispiel.

Sieht dann auch eher fancy aus im selben Sinne wie Donald Trumps Büro edel aussieht.

Der Grund dass Dächer nicht so aussehen wie Braukessel ist ja gerade dass es prohibitiv teuer ist da jedes Mal hochzuklettern und die zu polieren. Wenn man patiniertes Kupfer poliert sieht es danach wieder aus wie Kupfer (citiation needed).

Ich habe kein Problem damit auf Realismus zu pfeifen.

Aber die inhärente Diskrepanz in "wir stellen hier etwas dar was es in der Realität nicht gibt, wie machen wie die Reflektionen möglichst realistisch?" geht gegen mein Konsistenzedürfnis, sorry.
(Aber vielleicht sieht es auch ganz toll aus – bei Grafikprogrammierung ohne konsistentes Materialmodell geht Probieren über Diskutieren 🤷)
Mein Vorschlag wäre zu "probieren" dass es aussieht wie ein Kupferdach.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 09:57
von Matthias Gubisch
Alexander Kornrumpf hat geschrieben: 28.04.2025, 09:18
Matthias Gubisch hat geschrieben: 28.04.2025, 09:13 Kupfer ist ein Metall also Metallness auf 1.0
Kupfer (Cu) bekommst du an der frischen Luft (Dach) aber nicht zu sehen. Was du siehst ist irgendein Oxid (Umgangssprachlich "Patina", Krishty hatte oben Wikipedia verlinkt) und das ist kein Metall und sieht auch nicht aus wie ein Metall. Und das ist dann schon ein Problem.

Poliertes Kupfer zum Vergleich: https://www.dreher.at/brauanlagen/sudwerke/
Arg wahr wohl noch zu früh sorry dafür.
Das Oxid wird aber auch die Wolken nicht so wie gewünscht reflektieren fürchte ich.

Jonathan wie ist denn deine BRDF implementierung, werden MetalnessValues zwischen zwischen 0 und 1 akzeptiert oder nur dei beiden Ränder?
Vieleicht einfach mal versuchen die allseits bekannten PBR-Bälle zu renderen in der gewünschten Farbe um zu sehen ob man den Effekt so wie gewünscht auf diese Art und weise überhaupt hinbekommt?

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 10:08
von Krishty
Matthias Gubisch hat geschrieben: 28.04.2025, 09:57Das Oxid wird aber auch die Wolken nicht so wie gewünscht reflektieren fürchte ich.
Mit realistischem Fresnel-Term würden sie es schon tun – aber nur bei flachem Blickwinkel, wie in der Realität eben auch.
Alexander Kornrumpf hat geschrieben: 28.04.2025, 09:51Aber die inhärente Diskrepanz in "wir stellen hier etwas dar was es in der Realität nicht gibt, wie machen wie die Reflektionen möglichst realistisch?" geht gegen mein Konsistenzedürfnis, sorry.
Bin da völlig bei dir. Ich habe nur die große Befürchtung, dass man mit komplett konsistenten Materialmodellen immer entweder
  1. voll gegen die Wand fährt (falls man sich nicht total auskennt) weil es ein super komplexes Thema ist; oder
  2. am Ende bei dem Unreal-Engine-Look landet, der alle Spiele gleich aussehen lässt.
Ich würde Jonathan auch gern diktieren, sein Materialmodell gerade zu rücken und jeden Texel in einer PBR-Datenbank nachzuschlagen, aber ich traue ihm durchaus zu, auch mit Pi Mal Daumen etwas Schönes erschaffen zu können, wie es viele Game Designer vor PBR taten.

(Stark überspitzt glaube ich, dass er den klassischen Look links haben möchte und denke, ich sollte ihn dabei unterstützen, auch wenn ich konsistente Materialmodelle liebe)
Bild

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 10:22
von Alexander Kornrumpf
Krishty hat geschrieben: 28.04.2025, 10:08Bin da völlig bei dir. Ich habe nur die große Befürchtung, dass man mit komplett konsistenten Materialmodellen immer entweder
  1. voll gegen die Wand fährt (falls man sich nicht total auskennt) weil es ein super komplexes Thema ist; oder
  2. am Ende bei dem Unreal-Engine-Look landet, der alle Spiele gleich aussehen lässt.
Ich würde Jonathan auch gern diktieren, sein Materialmodell gerade zu rücken und jeden Texel in einer PBR-Datenbank nachzuschlagen, aber ich traue ihm durchaus zu, auch mit Pi Mal Daumen etwas Schönes erschaffen zu können, wie es viele Game Designer vor PBR taten.
PBR-Schmeber, habe ich gar keine Meinung zu. Aber ich würde wirklich wirklich raten sich auch Pi-Mal-Daumen an ein Kupferdach anzunähern und nicht an ein magisch reflektierendes Kupferdach.

Ironischerweise sieht dieses "reflektierende [EDIT: glänzende] Plastik" für mich sogar _mehr_ aus wie Unreal-Engine vor 15 Jahren (Deus-Ex Human Revolution oder so).
(Stark überspitzt glaube ich, dass er den klassischen Look links haben möchte ...
es gab ja diese weirde Phase als 2d isometrische Pixelgrafik noch besser aussah als die gleichzeitig erscheinenden 3D Spiele ich habe den 3D Look aus der Zeit nie gemocht. Das ist aber natürlich Geschmackssache. Der "Unreal-Look" hat 3D Grafik sozusagen für mich erst aus dem Uncanny Valley rausgeholt.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 13:47
von Jonathan
Sehr interessante Diskussion hier :)

Erst nochmal zum gewünschten Aussehen: Das ist größtenteils aus einer Spieldesignsicht gedacht. Ich habe jetzt 2 Stunden investiert um meine Siedlung hochzuziehen, und jetzt endlich hat man genügend Geld um das eigentliche Ziel anzugehen, die große Kathedrale in der Mitte der Stadt. Die soll daher entsprechend "wertig" aussehen und alle Blicke auf sich ziehen, quasi "das krönende Juwel" der Stadt sein.

Eine korrekte PBR Pipeline ist natürlich in vielerlei Hinsicht attraktiv, aber: Das Spiel sieht halt aktuell so aus:

Bild

Ein überwiegender Teil der Assets hat nicht einmal Normalmaps, und ich habe sicherlich nicht die Kapazitäten die Engine umzuprogrammieren und alle Assets zu überarbeiten, bzw. im Grunde neu zu erstellen. Das steht aus Projektmanagementsicht leider außer Frage. Auch wenn es cool wäre.

In diesem Sinne ist es mir auch egal, ob es ein Kupferdach ist. Von mir aus kann es poliertes Gold sein. Es ist ja überhaupt nur einem realen Gebäude nachempfunden, weil das halt ein nettes Osterei ist, und man ja irgendeine Vorlage braucht. Was auch immer man für ein Material am Ende hat, es soll a) teuer / schick aussehen, b) halbwegs in den Stil der aktuellen Grafik passen, und c) implementierbar sein, ohne vorher erst 2 Wochen die Engine umzuschreiben.

Vielleicht muss auch einfach noch eine goldene Statue aufs Dach oder so. Denn was mir gerade auch auffällt ist, dass die meisten Dachflächen einfach, nunja, flach sind. Die Normalenverteilung wird zwar durch die Schindeln durchaus komplex, aber aus der normalen Ansicht sind das einfach sehr hochfrequente Details und sehen eher nach Gegrissel aus. Deswegen schwäche ich ja aktuell für die Reflexion den Einfluss der Normalmap stark ein. Und dann bleiben hauptsächlich flache Oberflächen auf denen wenig spannendes passiert. Es hat ja schon einen Grund, weshalb die PBR Bälle eben Kugeln sind und keine Quadrate.

Aber die Idee, sie mal In-Engine nachzubauen um zu sehen, was das Shadermodell eigentlich kann, gefällt mir trotzdem. Ob ich sie dann genau so benutze ist vlt. etwas fraglich, aber vielleicht kann ich ja eine Mischung aus beiden machen. Mal schauen, ich probiers mal aus und berichte später.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 14:28
von Alexander Kornrumpf
Jonathan hat geschrieben: 28.04.2025, 13:47 Ich habe jetzt 2 Stunden investiert um meine Siedlung hochzuziehen, und jetzt endlich hat man genügend Geld um das eigentliche Ziel anzugehen, die große Kathedrale in der Mitte der Stadt. Die soll daher entsprechend "wertig" aussehen und alle Blicke auf sich ziehen, quasi "das krönende Juwel" der Stadt sein.

[...]

Was auch immer man für ein Material am Ende hat, es soll a) teuer / schick aussehen, b) halbwegs in den Stil der aktuellen Grafik passen, und c) implementierbar sein, ohne vorher erst 2 Wochen die Engine umzuschreiben.
Was ich versuche mitzuteilen ist, dass die "Wertigkeit" des Aussehens orthogonal zur Frage ist ob sich die Wolken oder gar das Gebäude in sich selbst korrekt spiegeln.

_Gerade_ bei deinem sonstigen Stil wird die Spielerin ohne Background in Grafikprogrammierung sich diese Frage schlicht nicht stellen, weil der Fotorealismus natürlich schon viel früher zusammenbricht.

Ich will dir absolut nicht absprechen für dein Hobbyprojekt zu implementieren worauf immer du gerade Bock hast und wenn das Fancy Reflexionen sind, dann viel Spaß damit, aber du optimierst damit nicht auf das was du sagst worauf du optimieren willst (dein a-c oben).

Das was du erreichen willst lässt sich mit deinen Mitteln denke ich besser dadurch erreichen eine Progression darzustellen, also das Gebäude in mehreren Schritten entstehen zu lassen. Du hattest es selbst in einem anderen Thread schon erwähnt.
Die Normalenverteilung wird zwar durch die Schindeln durchaus komplex,
In der Vorlage sind das übrigens gar keine Schindeln sondern entweder die Kupferplatten liegen press aneinander oder, das konnte ich in der Auflösung nicht ganz erkennen, wenn sie überlappen dann nicht mit diesem für Tonpfannen üblichen Wulst wie in deinem Bild sondern halt einfach flach übereinander. Das ist auch so einer der Gründe warum es "falsch" aussieht, noch bevor du überhaupt mit Reflektionen anfängst.

Generell hätte ich vorgeschlagen die Polygone zu verdoppeln und die Texturen besser zu machen, wenn du Wertigkeit willst, aber ich vermute du hast nach etwas gesucht was durch Programmieren und nicht so sehr durch Asset Creation limitiert ist.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 15:56
von scheichs
Ich habs mal in Unity reingeworfen mit Skybox und Grastextur, dabei deine Szene nachgestellt und mal aus Spielperspektive mit und ohne (HDR-)Bloom.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 16:42
von Jonathan
Oh, cool :)

Kannst du Bloom mal in Bewegung zeigen? Ich könnte mir vorstellen, dass ich das mag, wenn beim Drehen immer andere Stellen aufleuchten.

Re: Fancy Reflexionen

Verfasst: 28.04.2025, 18:38
von scheichs
Meinst Du so?
dom1.mp4
(14.21 MiB) 20-mal heruntergeladen

Re: Fancy Reflexionen

Verfasst: 29.04.2025, 06:35
von Jonathan
Ja, vielen Dank. Den Bloom-Effekt auf den Dach mag ich, ich schau mal, was ich in die Richtung machen kann.
Alexander Kornrumpf hat geschrieben: 28.04.2025, 14:28 Generell hätte ich vorgeschlagen die Polygone zu verdoppeln und die Texturen besser zu machen, wenn du Wertigkeit willst, aber ich vermute du hast nach etwas gesucht was durch Programmieren und nicht so sehr durch Asset Creation limitiert ist.
Haha, das ist eine gute Beobachtung. Einerseits bin ich viel besser im Programmieren als im Modellieren, und andererseits kann ich Weiterentwicklungen an der Grafikengine (e.g. "wir haben jetzt environment maps") immer noch für anderes benutzen. Eigentlich hab ich wirklich Lust, den Landvogt langsam auf Seite zu legen, aber vorher muss halt einmal mal etwas "fertig" sein. Monate lang Assets bauen passt da nicht wirklich in den Plan.