2011-09-06 12 views
8

Estoy tratando de convertir mi aplicación OpenGL ES 1 en una aplicación OpenGL ES 2 para poder usar Shaders. Ahora uso la función glOrthof para tener una "ventana gráfica de tamaño real", así puedo colocar los vértices en el píxel "real" en la vista OpenGL.Cómo lograr glOrthof en OpenGL ES 2.0

glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1); 

Estoy teniendo problemas para encontrar la manera de lograr esto en OpenGL ES 2, ¿hay alguien que me puede mostrar cómo hacer esto?

Si no es así, ¿alguien tiene un enlace a un buen tutorial/explicación de OpenGL ES 1 to OpenGL ES 2?

Respuesta

12

El método glOrtho no hace nada más que crear una nueva matriz y multiplicar la matriz de proyección actual por esta matriz. Con OpenGL ES 2.0 usted debe administrar las matrices usted mismo. Para replicar el comportamiento de glOrtho necesitas un uniforme para la matriz de proyección en tu sombreado de vértices, con el que multiplicas tus vértices. Por lo general, también tiene un modelo y una matriz de vista (o una matriz modelview combinado, como en OpenGL ES 1), que a transformar sus vértices con antes de la proyección transformada:

uniform mat4 projection; 
uniform mat4 modelview; 

attribute vec4 vertex; 

void main() 
{ 
    gl_Position = projection * (modelview * vertex); 
} 

la matriz de proyección específico que glOrtho construcciones se pueden encontrado here.

+0

¿Podría mostrarme cómo crear/cargar la proyección y la vista de modelo? – Thys

+0

@MrThys Si no está seguro de eso, primero debería consultar algunos recursos de aprendizaje sobre los sombreadores de OpenGL ES 2.0 y GLSL. Básicamente, una vez que tiene las ubicaciones uniformes correspondientes y el programa de sombreado está vinculado/usado, puede establecer sus valores con uno de los muchos ['glUniform ...'] (http://www.opengl.org/sdk/docs /man/xhtml/glUniform.xml) llamadas, en el caso de matrices usarías 'glUniformMatrix4fv' –

+0

Los enlaces están muertos ... – B0rk4

10

Como Christian describe, todas las matemáticas matriciales para procesar vértices dependen de usted, por lo que debe replicar la matriz que crea glOrthof(). En mi respuesta here, I, siempre el siguiente método Objective-C para generar una matriz de proyección ortográfica tales:

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far; 
{ 
    GLfloat r_l = right - left; 
    GLfloat t_b = top - bottom; 
    GLfloat f_n = far - near; 
    GLfloat tx = - (right + left)/(right - left); 
    GLfloat ty = - (top + bottom)/(top - bottom); 
    GLfloat tz = - (far + near)/(far - near); 

    matrix[0] = 2.0f/r_l; 
    matrix[1] = 0.0f; 
    matrix[2] = 0.0f; 
    matrix[3] = tx; 

    matrix[4] = 0.0f; 
    matrix[5] = 2.0f/t_b; 
    matrix[6] = 0.0f; 
    matrix[7] = ty; 

    matrix[8] = 0.0f; 
    matrix[9] = 0.0f; 
    matrix[10] = 2.0f/f_n; 
    matrix[11] = tz; 

    matrix[12] = 0.0f; 
    matrix[13] = 0.0f; 
    matrix[14] = 0.0f; 
    matrix[15] = 1.0f; 
} 

La matriz utilizada aquí se define como

GLfloat orthographicMatrix[16]; 

entonces aplico la matriz dentro de mi vértice shader usar algo como lo siguiente:

gl_Position = modelViewProjMatrix * position * orthographicMatrix; 

Mi pedido multiplicación difiere de Christian, por lo que puede estar haciendo algo un poco hacia atrás aquí, pero esto es lo que he usado para manejar esto dentro de una aplicación OpenGL ES 2.0 (cuyo código fuente se puede encontrar en here).

+0

Su método parece coincidir exactamente con la fórmula dada por la página glOrthof man (por ejemplo, http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml) – Tommy

+2

La matriz ortográfica es en realidad la matriz de proyección, pero el nombre 'modelViewProjMatrix' sugiere que tienes otra matriz de proyección, que es un poco extraña conceptualmente (aunque válida, lo que no es posible con los sombreadores). Pero lo realmente extraño es que se mezcla la aplicación izquierda con la aplicación correcta de transformaciones matriciales a vectores. Y esa es la razón por la que realmente creas la matriz transpuesta en tu rutina 'loadOrthoMatrix' (y la razón por la cual este código de shader debería causar una confusión total a cualquiera que no sea tan profundo en las transformaciones de la matriz). –

+0

@Christian - Realmente puedes decir que la matemática matricial no es una de mis áreas fuertes. El nombre del sombreador quedó de otra implementación, y realmente debería ser solo la matriz de vista del modelo para el primer componente. Me imaginé que este era un caso de dos izquierdas que hacía una derecha, pero había funcionado cuando lo probé, así que nunca pregunté por qué. Gracias por señalar las rarezas aquí. –

Cuestiones relacionadas