2015-09-15 1 views
1

J'essaye d'implémenter PCF pour une carte de cube d'ombre dans OpenGL 2.0. Je pensais avoir trouvé une solution here (chercher Percentage closer filtering (PCF) algorithm pour trouver le début de la section sur la carte du cube PCF), mais le code se base sur le samplerCubeShadow qui n'est pas disponible dans OpenGL 2.0 donc je ne peux pas utiliser l'appel à texture(samplerCubeShadow(), vec4()) montré sur cette page.Cubemap PCF: Obtenir le plan perpendiculaire à un vecteur à un point donné

La première partie de cette question est: Existe-t-il un moyen de récupérer les mêmes résultats à partir d'un samplerCube dans OpenGL 2.0/GLSL 1.10? En utilisant un textureCube ou autre chose?

La deuxième partie concerne une idée que je dois résoudre ce problème. L'image ci-dessous illustre ce que j'aimerais faire.

Light to Vertex/Plain

La ligne bleue et les lignes rouges en pointillés sont tous les vecteurs provenant d'une face de la samplerCube qui stocke mes valeurs de profondeur. L'intersection de la ligne bleue avec le carré gris foncé au centre des carrés noirs représente le point échantillonné du cube. Je voudrais créer un plan (représenté par le rectangle gris clair) qui est perpendiculaire au vecteur bleu. Ensuite, je voudrais échantillonner les 4 points noirs de la caméra en lançant des vecteurs Z de la position de la lumière (ce sont les lignes rouges en pointillés) à leurs valeurs x, Y sur ce plan. Ensuite, j'utiliserais ces valeurs combinées avec les valeurs de l'échantillon original pour calculer la valeur d'ombre du PCF.

Est-ce une manière viable et efficace de calculer PCF pour un pointlight/cubemap? Et comment pourrais-je créer le plan parallèle et ensuite récupérer les coordonnées X et Y dont j'ai besoin?

Répondre

0

Je ne peux pas dire si c'est efficace ou bon (ou même correct), mais c'est absolument faisable. Etant donné le vecteur v de la lumière au fragment, choisissez n'importe quel vecteur qui n'est pas parallèle à v. Le produit transversal w = croix (u, v) sera perpendiculaire à v. Prenons w comme axe et croisons (v, w) en tant que second axe.