actualizar - opengl download
¿Cómo puedo traducir objetos individuales en OpenGL 3.x? (2)
Empecemos con lo básico.
Generalmente, usted desea transformar sus vértices de triángulos locales a través de los siguientes pasos:
local-space coords-> world-space coords -> view-space coords -> clip-space coords
En GL estándar, las primeras 2 transformaciones se realizan a través de GL_MODELVIEW_MATRIX
, la tercera se realiza a través de GL_PROJECTION_MATRIX
Estas transformaciones de vista de modelo, para las muchas transformaciones interesantes que solemos aplicar (por ejemplo, traducir, escalar y rotar, por ejemplo), se pueden expresar como una multiplicación de matriz vectorial cuando representamos vértices en coordenadas homogéneas . Normalmente, el vértice V = (x, y, z)
se representa en este sistema como (x, y, z, 1)
.
De acuerdo. Digamos que queremos transformar un vértice V_local a través de una traducción, luego una rotación, luego una traducción. Cada transformación se puede representar como una matriz *, llamémoslos T1, R1, T2. Queremos aplicar la transformación a cada vértice: V_view = V_local * T1 * R1 * T2
. Si la multiplicación de matrices es asociativa, podemos calcular de una vez por todas M = T1 * R1 * T2
.
De esa manera, solo necesitamos pasar M hacia abajo al programa de vértice, y calcular V_view = V_local * M
Al final, un sombreador de vértice típico multiplica la posición del vértice por una sola matriz. Todo el trabajo para calcular esa matriz es cómo mover el objeto del espacio local al espacio de recorte.
Ok ... Eché un vistazo a una serie de detalles importantes.
Primero, lo que describí hasta ahora solo cubre la transformación que normalmente queremos hacer hasta el espacio de visualización, no el espacio de recorte. Sin embargo, el hardware espera que la posición de salida del sombreado de vértice se represente en ese espacio de clip especial. Es difícil explicar las coordenadas del espacio de recorte sin datos matemáticos significativos, por lo que lo omitiré, pero lo importante es que la transformación que lleva los vértices a ese espacio de recorte generalmente se puede expresar como el mismo tipo de multiplicación de matrices. Esto es lo que el antiguo gluPerspective, glFrustum y glOrtho computan.
Segundo, esto es lo que aplicas a las posiciones de vértice. La matemática para transformar las normales es algo diferente. Esto se debe a que desea que lo normal permanezca perpendicular a la superficie después de la transformación (para referencia, se requiere una multiplicación por la transposición inversa de la vista del modelo en el caso general, pero esto puede simplificarse en muchos casos)
Tercero, nunca envías coordenadas 4-D al vértice sombreado. En general se pasan las 3-D. OpenGL transformará esas coordenadas 3-D (o 2-D, por cierto) en 4-D para que el sombreado de vértice no tenga que agregar la coordenada adicional. expande cada vértice para agregar el 1 como la coordenada w
.
Entonces ... para volver a juntar todo eso, para cada objeto, debe calcular esas matrices M mágicas basadas en todas las transformaciones que desea aplicar al objeto. Dentro del sombreador, entonces tienes que multiplicar cada posición de vértice por esa matriz y pasarla a la salida de Posición del sombreado de vértice. El código típico es más o menos (esto es usar la nomenclatura antigua):
mat4 MVP;
gl_Position=MVP * gl_Vertex;
* las matrices reales se pueden encontrar en la web, especialmente en las páginas de manual para cada una de esas funciones: rotate , translate , scale , perspective , ortho
Tengo un poco de experiencia en la creación de aplicaciones OpenGL 2 y quiero aprender a usar OpenGL 3. Para ello, compré el "Libro rojo" y el "Libro naranja" de Addison Wesley (GLSL), que describen la anulación de la funcionalidad fija y La nueva tubería programable (shaders). Pero lo que no entiendo es cómo construir una escena con múltiples objetos sin usar las funciones de traducción *, rotación * y escala * obsoletas.
Lo que solía hacer en OGL2 era "moverse" en el espacio 3D usando las funciones de traducción y rotación, y crear los objetos en coordenadas locales donde los quería usando glBegin ... glEnd. En OGL3, todas estas funciones están en desuso y, según tengo entendido, reemplazadas por shaders. Pero no puedo llamar a un programa de sombreado para cada objeto que hago, ¿verdad? ¿Esto no afectaría a todos los otros objetos también?
No estoy seguro de haber explicado satisfactoriamente mi problema, pero el núcleo es cómo programar una escena con varios objetos definidos en coordenadas locales en OpenGL 3.1. Todos los tutoriales para principiantes que he encontrado usan solo un objeto y no tienen / resuelven este problema.
Edición: Imagina que quieres dos cubos que giran. Sería un dolor modificar manualmente cada coordenada de vértice, y no se puede simplemente modificar la matriz de vista de modelo, porque eso haría girar la cámara alrededor de dos cubos estáticos ...
Esas funciones están aparentemente en desuso, pero técnicamente siguen siendo perfectamente funcionales y de hecho se compilarán. Así que ciertamente puedes usar las funciones translate3f (...) etc.
SIN EMBARGO, este tutorial tiene una buena explicación de cómo funcionan los nuevos shaders y demás, Y para múltiples objetos en el espacio.
Puedes crear x matrices de vértices, y unirlas a x objetos VAO, y renderizar la escena desde allí con sombreadores, etc ... meh, es más fácil para ti simplemente leerlo, es una muy buena lectura para comprender el nuevo conceptos.
Además, el "Libro rojo" de OpenGL, como se le llama, tiene una nueva versión: la Guía oficial para el aprendizaje de OpenGL, versiones 3.0 y 3.1 . Incluye "Discusión sobre el mecanismo de eliminación de OpenGL y cómo verificar sus programas para futuras versiones de OpenGL".
Espero que sea de alguna ayuda!