gluPerspective a été supprimé dans OpenGL 3.1, des remplacements?

J’essaie de lire des tutoriels OpenGL sur le net. le problème est que j’ai trouvé d’anciens qui utilisent gluPerspective() . gluPerspective était obsolète dans OpenGL 3.0 et supprimé dans la version 3.1.

Quelle fonction puis-je utiliser à la place?

J’utilise C ++ avec la dernière version de FreeGlut installée.

Vous devez calculer la masortingce manuellement puis la transmettre à OpenGL.

Calcul de la masortingce

Cet extrait de code est basé sur la documentation gluPerspective .

  void BuildPerspProjMat(float *m, float fov, float aspect, float znear, float zfar) { float f = 1/tan(fov * PI_OVER_360); m[0] = f/aspect; m[1] = 0; m[2] = 0; m[3] = 0; m[4] = 0; m[5] = f; m[6] = 0; m[7] = 0; m[8] = 0; m[9] = 0; m[10] = (zfar + znear) / (znear - zfar); m[11] = -1; m[12] = 0; m[13] = 0; m[14] = 2*zfar*znear / (znear - zfar); m[15] = 0; } 

Il existe une bibliothèque C ++ appelée Mathématiques OpenGL qui peut être utile.

Chargement de la masortingce dans OpenGL 3.1

Je ne connais toujours pas l’API OpenGL 3.1, mais vous devez mettre à jour une masortingce sur le GPU, puis l’utiliser dans votre vertex shader pour obtenir la perspective appropriée. Le code suivant charge simplement la masortingce utilisant glUniform4fv sur la carte vidéo.

 { glUseProgram(shaderId); glUniformMasortingx4fv(glGetUniformLocation(shaderId, "u_proj_masortingx"), 1, GL_FALSE, theProjectionMasortingx); RenderObject(); glUseProgram(0); } 

Un vertex shader simple issu d’un blog aléatoire (trouvé grâce au débordement de stack).

 atsortingbute vec4 a_position; atsortingbute vec4 a_color; varying vec4 v_color; uniform mat4 u_proj_masortingx; uniform mat4 u_model_masortingx; void main() { mat4 mvp_masortingx = u_proj_masortingx * u_model_masortingx; v_color = a_color; gl_Position = mvp_masortingx * a_position; } 

Utilisez GLM .

 glm::mat4 projection = glm::perspective( // FOV & aspect 60.0f, 16.0f / 10.0f, // Near and far planes 0.001f, 1000f); // If you're using the now deprecated masortingx stacks glMasortingxMode(GL_PROJECTION); glLoadMasortingxf(glm::value_ptr(projection)); // if you're using the new shader based pipelines GLint projectionUniformLocation = ...; glUniformMasortingx4fv(projectionUniformLocation, 1, GL_FALSE, glm::value_ptr(projection)); 

Notez que si GLM_FORCE_RADIANS défini, vous devez utiliser des radians dans la fonction de perspective, pas des degrés …

 glm::mat4 projection = glm::perspective( // FOV & aspect PI / 3.0f, 16.0f / 10.0f, // Near and far planes 0.001f, 1000f); 

Copié d’un de mes projets plus anciens:

 // The following code is a fancy bit of math that is eqivilant to calling: // gluPerspective( fieldOfView/2.0f, width/height , 0.1f, 255.0f ) // We do it this way simply to avoid requiring glu.h GLfloat zNear = 0.1f; GLfloat zFar = 255.0f; GLfloat aspect = float(width)/float(height); GLfloat fH = tan( float(fieldOfView / 360.0f * 3.14159f) ) * zNear; GLfloat fW = fH * aspect; glFrustum( -fW, fW, -fH, fH, zNear, zFar ); 

Il s’agit d’une version modifiée de la fonction de Dan, avec des calculs simplifiés à partir du comportement non spécifié .

 void buildPerspProjMat(GLfloat *m, GLfloat fov, GLfloat aspect, GLfloat znear, GLfloat zfar){ GLfloat h = tan(fov); GLfloat w = h / aspect; GLfloat depth = znear - zfar; GLfloat q = (zfar + znear) / depth; GLfloat qn = 2 * zfar * znear / depth; m[0] = w; m[1] = 0; m[2] = 0; m[3] = 0; m[4] = 0; m[5] = h; m[6] = 0; m[7] = 0; m[8] = 0; m[9] = 0; m[10] = q; m[11] = -1; m[12] = 0; m[13] = 0; m[14] = qn; m[15] = 0; } 

La formule de diverses masortingces de perspective est documentée dans la documentation Direct3D .

Voici la formulation de D3DXMasortingxPerspectiveFovRH , la masortingce de projection en perspective pour droitier:

 yScale = cot(fovY/2) xScale = yScale / aspect ratio xScale 0 0 0 0 yScale 0 0 0 0 zf/(zn-zf) -1 0 0 zn*zf/(zn-zf) 0