En OpenGL, quelle est la façon la plus simple de créer une vue en perspective en utilisant seulement OpenGL3 + méthodes?

StackOverflow https://stackoverflow.com/questions/3498581

  •  29-09-2019
  •  | 
  •  

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)

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top