2013-10-09 1 views
0

J'ai trouvé ce code sur internet http://rioki.org/2013/03/07/glsl-skybox.html pour cubemap environnement texture (en fait rendre une skybox). Mais je ne comprends pas pourquoi ça marche.comprendre un code shader Opengl - cubemap?

void main() 
{ 
    mat4 r = gl_ModelViewMatrix; 
    r[3][0] = 0.0; 
    r[3][1] = 0.0; 
    r[3][2] = 0.0; 

    vec4 v = inverse(r) * inverse(gl_ProjectionMatrix) * gl_Vertex; 

    gl_TexCoord[0] = v; 
    gl_Position = gl_Vertex; 
} 

Alors gl_Vertex est en coordonnées du monde, mais qu'est-ce que nous obtenons en multipliant l'inverse de la matrice de projection et modelview matrice?

c'est le code que j'utilise pour dessiner mon skybox

void SkyBoxDraw(void) 
{ 
GLfloat SkyRad = 1.0f; 

glUseProgramObjectARB(glsl_program_skybox); 
glDepthMask(0); 
glDisable(GL_DEPTH_TEST); 
// Cull backs of polygons 
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
glEnable(GL_TEXTURE_CUBE_MAP); 

glBegin(GL_QUADS); 
    ////////////////////////////////////////////// 
    // Negative X 
    glTexCoord3f(-1.0f, -1.0f, 1.0f); 
    glVertex3f(-SkyRad, -SkyRad, SkyRad); 

    glTexCoord3f(-1.0f, -1.0f, -1.0f); 
    glVertex3f(-SkyRad, -SkyRad, -SkyRad); 

    glTexCoord3f(-1.0f, 1.0f, -1.0f); 
    glVertex3f(-SkyRad, SkyRad, -SkyRad); 

    glTexCoord3f(-1.0f, 1.0f, 1.0f); 
    glVertex3f(-SkyRad, SkyRad, SkyRad); 
    ...... 
    ...... 
glEnd(); 

glDepthMask(1); 
glDisable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
glDisable(GL_TEXTURE_CUBE_MAP); 

glUseProgramObjectARB(0); 

} 
+0

pouvez-vous partager le lien vers le tutoriel? Êtes-vous sûr que c'est correct? Voir http://www.ozone3d.net/tutorials/glsl_texturing_p04.php#part_43 tutoriel pour une référence – fen

+0

Je l'ai trouvé d'ici: http://www.rioki.org/2013/03/07/glsl-skybox. html –

Répondre

2

Alors gl_Vertex est en coordonnées monde ...

Non non non, gl_Vertex est dans l'objet/modèle espace sauf si je vois du code ailleurs (par exemple comment votre position de vertex est calculée dans la partie non-shader de votre programme) qui indique le contraire :) Dans OpenGL, nous passons de l'espace objet à l'oeil/vue/caméra la matrice combinée Model * View. Comme vous pouvez le voir, il y a beaucoup de noms pour les mêmes espaces de coordonnées, mais l'espace-objet n'est certainement pas un synonyme d'espace-monde. Régler r3 sur < 0, 0, 0, 1> repositionne fondamentalement l'origine de la caméra sans affecter la direction, ce qui est utile lorsque tout ce que vous voulez savoir est la direction d'une recherche cubemap.

Voilà, en un mot, ce que vous voulez lorsque vous utilisez des cubes. Juste un vecteur de direction simple. Le fait que textureCube (...) prenne un vecteur 3D au lieu de 4D est une indication immédiate qu'il cherche une direction au lieu de la position. Les vecteurs de position ont un 4ème composant, la direction ne le fait pas. Donc, techniquement, si vous vouliez porter ce shader vers un OpenGL moderne, vous utiliseriez probablement un out vec3 et un swizzle .xyz de v, puisque v.w est inutile.

... mais qu'est-ce qu'on obtient en multipliant cela par l'inverse de la matrice de projection et ensuite de la matrice modelview?

Vous annulez la projection lorsque vous multipliez par l'inverse de ces matrices. La seule façon dont ce shader a du sens est si les coordonnées que vous passez pour vos sommets sont définies dans l'espace-clip. Donc, au lieu de passer de l'espace objet à travers le pipeline GL et de terminer dans l'espace-écran, vous voulez inverser cela, puisque la fenêtre n'est pas impliquée dans votre shader, nous ne pouvons pas gérer l'espace-écran. Un peu plus d'informations sur la façon dont vos positions de vertex sont calculées devraient éclaircir cela.

+0

Pourriez-vous s'il vous plait reformuler "orienter à l'origine" en "se déplace vers l'origine, en maintenant l'orientation". L'orientation peut être comprise comme un synonyme de «virage» et cela ne tourne pas la caméra vers un point précis. Il déplace son emplacement, en gardant sa direction de vue. – datenwolf

+0

Oups, bon point :) –

+0

bien merci pour le nettoyage des choses. Je ne fais rien de particulier, j'ai utilisé ce code pour ma skybox. ce qui est juste une boîte que j'utilise un cubemap pour sa texture. Mais ce code fonctionne. Mais je ne comprends toujours pas, comme vous l'avez dit, cela n'a de sens que si les coordonnées sont dans l'espace du clip. –