Sto lavorando con punti di luce omnidirezionali. Ho già implementato la mappatura delle ombre utilizzando una texture cubemap come allegato di colore di 6 framebuffer e codificando la distanza da luce a frammento in ciascun pixel di esso.Mappatura shadow omnidirezionale con cubemap di profondità
Ora vorrei, se questo è possibile, cambiare la mia applicazione in questo modo:
- 1) allegare una texture di profondità cubemap al buffer di profondità del mio framebuffer, invece dei colori.
- 2) solo profondità di rendering, non scrivere colore in questo passaggio
- 3) nel passaggio principale, leggere la profondità dalla texture cubemap, convertirla in una distanza e verificare se il frammento corrente è occluso dal leggero o no
Il mio problema si verifica quando si converte un valore di profondità dalla mappa del cubo in una distanza. Io uso il vettore light-to-framment (nello spazio mondo) per recuperare il mio valore di profondità nella cubemap. A questo punto, non so quale dei sei volti venga usato, né quali coordinate della trama 2D corrispondano al valore di profondità che sto leggendo. Quindi, come posso convertire il valore di profondità a una distanza?
Ecco frammenti di mio codice per illustrare:
profondità di struttura:
glGenTextures(1, &TextureHandle);
glBindTexture(GL_TEXTURE_CUBE_MAP, TextureHandle);
for (int i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT,
Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
frame buffer costruzione:
for (int i = 0; i < 6; ++i)
{
glGenFramebuffers(1, &FBO->FrameBufferID);
glBindFramebuffer(GL_FRAMEBUFFER, FBO->FrameBufferID);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, TextureHandle, 0);
glDrawBuffer(GL_NONE);
}
Il pezzo di frammento di shader che sto cercando di scrivere di raggiungere il mio codice:
float ComputeShadowFactor(samplerCubeShadow ShadowCubeMap, vec3 VertToLightWS)
{
float ShadowVec = texture(ShadowCubeMap, vec4(VertToLightWS, 1.0));
ShadowVec = DepthValueToDistance(ShadowVec);
if (ShadowVec * ShadowVec > dot(VertToLightWS, VertToLightWS))
return 1.0;
return 0.0;
}
La funzione DepthValueToDistance è il mio problema reale.
"C'è una soluzione al mio problema?" Converti distanza in profondità, confronta con profondità memorizzata in cubemap. "Inapplicabile per le ombre delle mappe dei cubi" Penso che 5..7 anni fa qualcuno ha chiamato "ron frazier", ha scritto un articolo sull'utilizzo di cubemaps per la mappatura delle ombre. – SigTerm
@SigTerm http://www.ronfrazier.net/apparition/index.html?appmain=research/index.html è ciò di cui penso tu stia parlando. –
@JohnRiselvato: Sì. I ** think ** era [this] (http://www.ronfrazier.net/apparition/index.html?appmain=research/index.html) articolo. Ovviamente è possibile fare qualcosa di simile con la moderna OpenGL/migliore precisione (ci sono trame in virgola mobile, GLSL, '* shadow' sampler, ecc.) - Non ho uno snippet funzionante nelle vicinanze e non ho voglia di scriverne uno . – SigTerm