En OpenGL, quelle est la façon la plus simple de créer une vue en perspective en utilisant seulement OpenGL3 + méthodes?
Question
Cela peut paraître paresseux au début, mais j'ai fait des recherches pendant 2 jours.
J'ai une application SDL + GLEW qui dessine une primitive. Je voulais faire quelques points de vue dans différentes fenêtres. Je vois les quatre fenêtres mais je ne peux pas changer les perspectives.
Supposons que vous avez
draw();
swapbuffers();
Quelle est la façon la plus simple - en OpenGL3 + spec - pour créer une fenêtre en perspective (ou, idéalement, plusieurs plus)
La solution
est la seule façon la plus simple. Calculez vous-même (avec quelques lib, mathématiques plaine, etc) une matrice de projection et le télécharger sur un uniforme dans votre vertex shader, et faire la transformation là.
Autres conseils
Voici le code GLSL 1.50 pour faire la même chose que gluPerspective. Vous pouvez facilement convertir en langue de votre choix et le télécharger via glUniformMatrix4fv à la place.
mat4 CreatePerspectiveMatrix(in float fov, in float aspect,
in float near, in float far)
{
mat4 m = mat4(0.0);
float angle = (fov / 180.0f) * PI;
float f = 1.0f / tan( angle * 0.5f );
/* Note, matrices are accessed like 2D arrays in C.
They are column major, i.e m[y][x] */
m[0][0] = f / aspect;
m[1][1] = f;
m[2][2] = (far + near) / (near - far);
m[2][3] = -1.0f;
m[3][2] = (2.0f * far*near) / (near - far);
return m;
}
Alors vous faites:
mat4 worldMatrix = CreateSomeWorldMatrix();
mat4 clipMatrix = CreatePerspectiveMatrix(90.0, 4.0/3.0, 1.0, 128.0);
gl_Position = worldMatrix * clipMatrix * myvertex;
some_varying1 = worldMatrix * myvertex;
some_varying2 = worldMatrix * vec4(mynormal.xyz, 0.0);
Pour la matrice en perspective:
gluPerspective
, puis glGetFLoatv(GL_PROJECTION_MATRIX, ...)
, puis glUniform
ou glUniformMatrix4fv
Pour viewports: glViewport
et glScissor
. Ou utiliser l'objet framebuffer, rendre à la texture, puis rendre la texture.
P.S. Si vous ne souhaitez pas utiliser les fonctionnalités dépréciées, formule matricielle grab de gluPerspective documentation , matrice de calcul vous-même, puis utilisez glUniformMatrix4fv. Ou travailler dans le profil de compatibilité.