Comprensión profunda del tutorial introductorio de OpenGL

1. Introducción a OpenGL

  • OpenGL es una especificación de programación de aplicaciones multiplataforma y multilenguaje para renderizar gráficos vectoriales 2D y 3D .
  • OpenGL contiene una serie de funciones que pueden manipular gráficos e imágenes, pero OpenGL no implementa estas funciones, OpenGL solo estipula cómo se debe ejecutar cada función y su valor de salida (similar a la interfaz), por lo que OpenGL es solo una especificación estricta .
  • La especificación OpenGL especifica estrictamente cómo se debe ejecutar cada función, así como sus valores de salida. En cuanto a cómo se implementa cada función interna (Implement), lo decidirá el desarrollador de la biblioteca OpenGL. El desarrollador de la biblioteca OpenGL real suele ser el fabricante de la tarjeta gráfica .
  • OpenGL está diseñado para ser solo de salida, por lo que solo proporciona funciones de representación . La API central no tiene concepto de sistemas de ventanas, audio, impresión, teclado/mouse u otros dispositivos de entrada. Si bien esto puede parecer una limitación al principio, permite que el código de representación sea completamente independiente del sistema operativo en el que se ejecuta, por lo que OpenGL permite el desarrollo multiplataforma .
  • OpenGL no proporciona un compilador de sombreado, pero el controlador de la tarjeta gráfica completa el trabajo de compilación del sombreador , es decir, siempre que el controlador de la tarjeta gráfica admita la compilación de GLSL, puede ejecutarse, por lo que OpenGL puede ser multiplataforma .
  • Modo básico y modo de renderizado inmediato:
    Early OpenGL usa renderizado inmediato (modo inmediato, es decir, canal de renderizado fijo) es fácil de usar y comprender, pero la eficiencia es demasiado baja. A partir de OpenGL3.2, se abandona el modo de renderizado inmediato y se recomienda el uso del modo central (Core-profile).
    Modo básico: Requiere que los usuarios entiendan realmente OpenGL y la programación de gráficos, lo cual es algo difícil, pero brinda más flexibilidad, mayor eficiencia y una comprensión más profunda de la programación de gráficos.
  • Extensión:
    una característica importante de OpenGL es el soporte para extensiones.Cuando una compañía de tarjetas gráficas propone una nueva característica o una optimización importante en el renderizado, generalmente se implementa en el controlador de manera extendida .
  • Máquina de estado:
    OpenGL en sí mismo es una gran máquina de estado (State Machine): una serie de variables describen cómo debería funcionar OpenGL en este momento . El estado de OpenGL generalmente se denomina contexto OpenGL (Contexto) . Usualmente usamos las siguientes formas de cambiar el estado de OpenGL: opciones de configuración, búferes de operación . Finalmente, renderizamos usando el contexto OpenGL actual .
  • Objeto:
    la biblioteca OpenGL está escrita en lenguaje C y también admite la derivación de muchos lenguajes, pero su núcleo sigue siendo una biblioteca C. Dado que algunas estructuras de lenguaje de C no se traducen fácilmente a otros lenguajes de alto nivel , se introdujeron algunas capas de abstracción durante el desarrollo de OpenGL. "Object (Objeto)" es uno de ellos .
    Una ventaja de usar objetos es que en el programa podemos definir más de un objeto y configurar sus opciones, y cada objeto puede tener configuraciones diferentes . Cuando realizamos una operación que usa el estado OpenGL, solo necesitamos vincular el objeto con la configuración requerida .

Dos, programa OpenGL

 Todos sabemos que el programa se ejecuta en la CPU y el código del programa está en la memoria. En nuestro concepto habitual, solo la CPU y la memoria están involucradas, pero el programa de renderizado que usa OpenGL es diferente, lo que involucra la GPU y la memoria de video . como se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

De la memoria a la videomemoria

  • Nuestro programa se ejecuta en la CPU y los datos del programa se almacenan en la memoria .
  • Cuando necesitamos renderizar una escena, es posible que necesitemos algunos datos de vértice, datos de textura, parámetros de sombreado, etc. de los objetos de la escena. Estos datos son especificados por nuestro programa, inicialmente se almacenan en la memoria externa y los leemos en la memoria cuando nuestro programa se ejecuta en la CPU .
  • Hay memoria de video en la tarjeta gráfica , y este búfer puede almacenar los datos necesarios para una serie de escenas de representación, como el búfer de gráficos, el búfer de profundidad, la textura y el búfer de vértices. Usando estos datos, ejecuta las instrucciones de renderizado de la GPU para renderizar la escena que queremos.
  • Entonces la pregunta es, ¿ cómo transferimos los datos de la memoria a la memoria de video?
  • No hay duda de que la respuesta a todo esto está en OpenGL. A través de funciones relacionadas con OpenGL, nuestro programa que se ejecuta en la CPU puede enviar datos a la memoria de video y almacenar los datos necesarios para renderizar la escena en el búfer de memoria de video de los gráficos. tarjeta _

Máquina de estado de renderizado OpenGL

  • Cuando los datos necesarios para el renderizado se han transferido a la memoria de video, ¿ cómo ejecutamos los comandos de renderizado de la GPU?
  • Las instrucciones de renderizado de la GPU son de muy bajo nivel, involucrando parámetros de hardware como el tipo de tarjeta gráfica, por lo que nos es imposible llamar a instrucciones tan complejas. Pero tenemos OpenGL.
  • El renderizado es un proceso fijo y no podemos conectarnos a las instrucciones subyacentes de la GPU. ¿Podemos construir un modelo de renderizado independiente del hardware y de propósito general ? Por supuesto que puedes, esto es OpenGL.
  • La renderización es un proceso, y hay muchas opciones que se pueden configurar en este proceso. A estas opciones las llamamos el estado de OpenGL . La llamada máquina de estado tiene muchos parámetros como estado, y reaccionará de manera diferente en diferentes situaciones de estado , como mostrar diferentes resultados de renderizado en diferentes opciones de escena.
  • OpenGL es una máquina de estado de representación completa. La organización Khronos desarrolló y mantuvo OpenGL. En otras palabras: establecieron el modelo de máquina de estado de OpenGL . Este modelo se utiliza para renderizar y contiene muchos parámetros como estado. Para este modelo, la organización Khronos formuló las funciones que debe contener OpenGL , incluidas algunas funciones de configuración de estado (función de cambio de estado) y funciones de aplicación de estado (función de uso de estado). Use la función de configuración de estado para cambiar el contexto de OpenGL, es decir, el estado de OpenGL, y use la función de aplicación de estado para realizar algunas operaciones de acuerdo con el estado actual de OpenGL.
  • Como se mencionó en la introducción, OpenGL es solo una especificación y no tiene una implementación de función específica. Como se mencionó anteriormente, OpenGL es solo un modelo de representación que contiene muchos estados y formula un conjunto de especificaciones de funciones requeridas para la representación. Entonces, ¿cómo construimos un puente entre el modelo matemático de OpenGL y las instrucciones de renderizado subyacentes de la GPU? Es decir, ¿quién debe implementar las funciones formuladas por OpenGL? Esto suele ser lo que debe pensar el desarrollador de la tarjeta gráfica. El desarrollador de la tarjeta gráfica desarrolla el controlador OpenGL para la tarjeta gráfica específica en función de la especificación del modelo OpenGL, es decir, la tarjeta gráfica ejecutará instrucciones de representación específicas en un estado OpenGL específico .
  • De esta manera, solo necesitamos interactuar con OpenGL, una máquina de estado independiente del hardware de propósito general, para ejecutar las instrucciones de renderizado de GPU que necesitamos. La interacción entre el programa y OpenGL no es más que cambiar el estado de OpenGL , como configurar las opciones de OpenGL u operar el búfer, llamando a la función de configuración de estado . Comportamientos tales como realizar operaciones de renderizado se implementan a través de funciones de aplicación de estado . En resumen, el estado de renderizado se establece primero y luego la operación de renderizado se realiza en función del estado.

3. GLFW y GLEW

 Continuando con lo anterior, OpenGL solo proporciona funciones de renderizado, y no existe un concepto de entrada como la creación de ventanas y el monitoreo del teclado en la API principal , por lo que si queremos realizar el renderizado, debemos mostrar la pantalla renderizada en la ventana de la computadora, lo que debería ¿hacemos?
 Simplemente use GLFW, GLFW es un marco de aplicación OpenGL multiplataforma que admite funciones como la creación de ventanas, la entrada y la aceptación de eventos . Sus miembros comienzan con el formulario GLFW .
 Como se mencionó anteriormente, cuando queremos usar una función OpenGL, debemos verificar si la plataforma actual admite esta función y devolver el puntero de esta función. Sin duda, esto es algo muy problemático, entonces, ¿hay alguna forma conveniente?
 Simplemente use GLEW, que es una biblioteca de extensión C++ multiplataforma basada en la interfaz gráfica OpenGL . GLEW puede identificar automáticamente todas las funciones de extensión avanzadas de OpenGL admitidas por la plataforma actual . Siempre que se incluya el archivo de encabezado glew.h, se pueden usar todas las funciones de gl , glu, glext, wgl y glx. GLEW es compatible con varios sistemas operativos que son populares actualmente. Sus miembros a menudo comienzan con gl.

4. Otros

 Este artículo se refiere y cita el contenido del artículo referenciado .
 El contenido de este artículo es solo mis impresiones personales en el aprendizaje de OpenGL, si hay alguna inadecuación, no dude en informarme.

Supongo que te gusta

Origin blog.csdn.net/qq_51563654/article/details/130233937
Recomendado
Clasificación