2015-09-06 2 views
0

Je suis toujours un débutant dans OpenGL. J'essaye de dessiner un carré parfait sur la taille d'écran 1280 par 720 en utilisant des shaders. J'utilise OpenGL Core Profile, version 3.3. J'étais coincé avec quand j'ai essayé de dessiner un carré en 1280 par 720OpenGL viewport distortion

enter image description here

Après un certain temps de recherche, je me suis aperçu que la taille est fausse par la taille de la fenêtre, après avoir changé la taille de la fenêtre à 720 par 720, j'ai compris.

This is in a viewport with size of 720 by 720

Dans l'OpenGL héritage, ils ont un solution pour résoudre ce problème, mais maintenant il est dépréciée dans le profil de base. Problème: Comment dessiner un carré parfait en taille d'écran 1280 x 720, en utilisant uniquement le profil de base, OpenGL 3.3?

+2

Vous devez faire exactement la même chose. Appliquer une transformation de projection orthographique. Dans votre cas, juste dans un shader. –

+0

@NicoSchertler Le shader a-t-il une telle fonction? ou je dois me calculer? – kimnod

+0

Le shader n'a pas de solution interne pour cela, achetez vous pouvez utiliser une librairie externe, telle que glm. http://glm.g-truc.net/0.9.7/index.html –

Répondre

0

Mettre à l'échelle par (2.0/width, 2.0/height). Si vous avez une matrice de caméra, il suffit de la multiplier avec cette mise à l'échelle.

En utilisant cette transformation, vous pouvez saisir des positions en tant que pixels avec l'origine au milieu de l'écran.

1

L'application d'une transformation de projection est la manière la plus courante de résoudre ce problème. Vous pouvez trouver des détails sur la façon de le faire dans presque n'importe quel tutoriel qui montre comment utiliser OpenGL avec les shaders. En résumé, vous avez généralement une matrice de projection comme une variable uniforme dans votre vertex shader et de les appliquer aux positions d'entrée:

uniform mat4 ProjMat; 
in vec4 InPosition; 
... 
    gl_Position = ProjMat * InPosition; 

Dans votre code C++, vous calculer la matrice pour appliquer la mise à l'échelle nécessaire, et définir en utilisant glUniformMatrix4fv().

Une autre option est que vous gardez la fenêtre d'affichage à l'équerre. Alors que la fenêtre est souvent définie pour correspondre à la taille de la fenêtre, cela n'a pas avoir pour être le cas. Par exemple, la fenêtre peut s'étendre au-delà de la taille de la fenêtre. Pour utiliser cette approche, vous devriez avoir quelque chose comme ça dans le code où vous définissez la fenêtre en réponse aux événements de (re) taille de la fenêtre. Avec w et h la largeur et la hauteur de la fenêtre:

if (w > h) { 
    glViewport(0, (h - w)/2, w, w); 
} else { 
    glViewport((w - h)/2, 0, h, h); 
} 

Cela prend la plus grande des deux dimensions de la fenêtre que la taille de la fenêtre d'affichage, et étend la fenêtre au-delà de la fenêtre dans l'autre dimension pour produire une fenêtre carrée.