Ich versuche, Shadow Mapping in WebGL zu studieren. Ich sehe das gleiche Stück Shader-Code in verschiedenen Bibliotheken und Beispielen, die dies erreichen. Aber nirgends habe ich die Erklärung dafür gefunden, wie es funktioniert.Float in vec4 verpacken - wie funktioniert dieser Code?
Die Idee besteht darin, einen Tiefenwert (ein einzelnes Float) in den Farbpuffer (vec4) zu speichern. Es gibt eine Paketfunktion, die float in vec4 speichert und die Funktion entpackt, die den float von vec4 abruft.
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
Ich hätte gedacht, dass ein Schwimmer in vec4 Verpackung sollte ein triviales Problem sein, kopieren Sie sie einfach in einen der vier Schlitze von vec4 und andere ungenutzt lassen. Deshalb ist die Bitverschiebungslogik im obigen Code für mich rätselhaft.
Kann jemand etwas Licht abwerfen?
Ich sehe. Es war mir nicht klar, dass der Farbpuffer intern den Farbwert als 4 ganze Zahlen speichert, obwohl wir ihm einen vec4 geben. Wenn das so ist, dann macht der obige Code Sinn. Vielen Dank. – Jayesh
Genau genommen ist die Umwandlung eine 32-Bit-Festkommazahl - keine Fließkommazahl. – Mortennobel