OpenGL ES primera configuración artículo y contexto de uso básico

contexto Configuración de OpenGL ES

Aplicar cada una de OpenGL ES proporciona una forma de crear un contexto para gestionar el OpenGL ES especificación estado obligada. Estos estados en un contexto de proceso, que varias aplicaciones compartan el hardware de gráficos sin interferir con el otro estado. Vamos a explicar en detalle cómo crear y configurar un contexto en iOS

EAGL se logra en contexto de representación iOS OpenGL ES

Antes de su aplicación llama a la función OpenGL ES, debe inicializar un EAGLContextobjeto. EAGLContextClase también proporciona un método para el contenido de OpenGL ES con la integración Core Animation.

El contexto actual es el objetivo llamada a la función OpenGL ES

iOS tiene un contexto actual de cada hilo cuando se llama a la función OpenGL ES, llamando el contexto de este estado será cambiado. Para establecer el contexto actual del hilo, el uso [EAGLContext setCurrentContext:myContext], el acceso al contexto actual [EAGLContext currentContext].

* Si cambia en el mismo subproceso dos o más contextos, el establecimiento de un nuevo contexto para el contexto actual de ser llamado antes de glFlushla función. Presentado antes de este comando para garantizar la entrega oportuna de hardware de gráficos.

OpenGL ES tiene un objeto EAGLContext referencia fuerte correspondiente al contexto actual. (Si el contador de referencia manualmente, OpenGL ES que sostiene el objeto) cuando el llamando setCurrentContext:contexto del proceso para cambiar el contexto actual, OpenGL ES antes ya no se hace referencia. Con el fin de prevenir objeto EAGLContext no se destruye por el contexto actual, la aplicación debe mantener referencias fuertes (o mantener) estos objetos.

Cada contexto de una versión específica de OpenGL ES

A EAGLContext solamente un objetivo versión OpenGL ES. Para la versión de OpenGL ES 1.1 no es compatible con el código escrito en el contexto de 2,0 o 3,0. Uso núcleo OpenGL ES 2.0 3.0 El código de función es compatible con el contexto de OpenGL ES 2.0 código de expansión está diseñado típicamente para ser utilizado en el contexto de 3,0, sólo pequeñas modificaciones. Muchas de las nuevas y mejoradas capacidades del hardware 3.0 deben estar contexto 3.0. Al crear e inicializar objetos EAGLContext, la aplicación va a determinar qué versión de OpenGL ES. Si admite su dispositivo requiere versión de OpenGL ES, initWithAPI:el método devuelve nil. Las solicitudes deben ser probados antes de su uso para asegurar el éxito de inicialización de contexto. Con el fin de soportar múltiples versiones de OpenGL ES en su aplicación como opciones de renderizado, primero debe intentar inicializar una nueva versión de contexto. Si regresa nil, a continuación, inicializar una versión anterior. Ejemplos son los siguientes:

EAGLContext *createBestEAGLContext() {
	EAGLContext *ctx = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES3];
	if (ctx == nil) {
		ctx = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
	}
	return ctx;
}

A EAGL ShareGroup OpenGL ES para el grupo de objetos de gestión de contexto

Aunque contexto OpenGL ES mantiene el estado, pero no gestiona directamente grupo de objetos OpenGL ES. En su lugar, los grupos de objetos OpenGL ES creados y mantenidos por el objeto EAGLSharegroup. Cada contexto contiene unos objetos EAGLSharegroup, se creará objetos confiados a este objeto.

Cuando dos o más contextos se refieren al mismo sharegroup, sus ventajas son evidentes. Están conectados a un sharegroup común contexto múltiple, crear el objeto de OpenGL ES en cualquier contexto se puede utilizar en todos los contextos. Si unido a otro contexto, se crea con el mismo identificador de objeto de contexto, la misma referencia OpenGL ES objetos. En los dispositivos móviles es muy escasos recursos, crear el mismo contenido en diferentes contextos múltiples copias es un desperdicio. El uso de dispositivos para compartir recursos comunes mejores recursos gráficos

sharegroup es un objeto abstracto, métodos y propiedades no pueden ser llamados directamente. Uso sharegroup contexto del objeto sigue siendo una referencia fuerte.

dos contextos que comparten objetos OpenGL ES

  • sharegroups útil en los dos escenarios siguientes:
    • La mayor parte de los recursos compartidos entre contextos sin cambios
    • Cuando se desea crear un nuevo grupo objeto de la aplicación para el renderizado OpenGL ES en otro hilo en lugar del hilo principal. En este caso, las segundas carreras de contexto en un hilo separado, que se concentran en el acceso a los datos y recursos para crear. En la carga de recursos se completa, el primer contexto se puede unir al objeto y se puede utilizar inmediatamente. GLKTextureLoaderEste modelo proporciona una clase de textura utiliza carga asíncrona.
// 为了创建多个上下文引用相同的sharegroup,第一个上下文通过调用 initWithAPI: 来初始化,sharegroup会自动被这个上下文创建
// 第二个或后面的上下文通过第一个上下文的sharegroup调用 initWithAPI: sharegroup:来初始化。
EAGLContext *firstCtx = createBestEAGLContext()
EAGLContext *secondCtx = [[EAGLContext alloc] initWithAPI: [firstCtx API] sharegroup: [firstCtx sharegroup]];
  • Cuando sharegroup es compartida en múltiples contextos, es responsable de la gestión de los grupos objeto de aplicación los cambios de estado de OpenGL ES. Las reglas son las siguientes:

    • Si el objeto no se ha modificado, sus aplicaciones pueden acceder simultáneamente el objeto a través de múltiples contextos
    • Cuando el objeto que está siendo modificado por los comandos transmitidos al contexto, se permite que el objeto a leer o modificar cualquier otro contexto
    • La modificación realizada en el objeto, todo contexto, el objeto debe ser re-ligado para ver los cambios. Si el contexto se refieren a ella antes de que el objeto dependiente, el objeto de contenido no está definido.
  • Su solicitud debe dirigirse a la actualización de OpenGL ES, siga estos pasos

      1. En el contexto de las llamadas de todos los usos posibles del objeto glFlush
      1. En el contexto del objeto que desea modificar, una llamada o más funciones de OpenGL ES cambia el objeto
      1. En el contexto del estado de recepción de llamadas en el comando de modificación glFlush
      1. En otros contextos, la revinculación identificador de objeto

* Otra forma es utilizar un único contexto objeto renderizado compartido, pero una pluralidad de memoria intermedia de trama de destino. Cuando la prestación de su aplicación marco derecho tampón de unión, y la prestación de fotogramas que sean necesarios. Debido a que todos los objetos son referenciados OpenGL ES de un contexto, que ven los mismos datos en OpenGL ES. Este modo utiliza menos recursos, pero sólo es útil para aplicaciones de subprocesos individuales, el control detallado puede ser un solo estado contexto hilo.

GLKit y dibujo con OpenGL ES

GLKit ofrece vista de clase y controlador de vista, que se utiliza para eliminar gráficos y animación contenido OpenGL ES requerido para crear y mantener código. GLKView infraestructura de gestión de clase OpenGL ES representación código para proporcionar un lugar, GLKViewController vista GLKit clase de contenido OpenGL ES proporciona una animación suave representación ciclos. Estas clases se extiende a los patrones de diseño UIKit estándar para dibujar vista de presentación de contenido y vistas de administración. Esto a su vez puede centrarse principalmente en OpenGL ES renderizado de código y un comienzo rápido y ejecutar la aplicación. GLKit otras características también se proporcionan al desarrollo simplificar y OpenGL ES2.0 3.0.

OpenGL ES rendering requerido por la vista de contenido GLKit

clase GLKView proporciona un OpenGL ES haciendo que el mismo ciclo basado UIView. Un ejemplo UIView configurar automáticamente su contexto propios gráficos, por lo que el drawRect: Sólo es necesario para llevar a cabo la implementación del método comandos de dibujo 2D de cuarzo puede, por lo GLKView instancia se configura automáticamente la forma de dibujar simplemente ejecutar comandos de dibujo OpenGL ES. clase GLKView es proporcionar esta funcionalidad mediante el mantenimiento de un objeto framebuffer (que sostiene el OpenGL ES comandos de dibujo). Una vez que el sorteo final acarreará automáticamente el procedimiento vuelve a Core Animation. Al igual que la vista UIKit estándar de la misma, vista GLKit para hacer su contenido será necesario. Si su punto de vista es el primero en mostrar, puede llamar al método draw (salida prestación Core Animation se almacenan en caché y cuando la vista que desea que aparezca mostrará). Cuando se desea cambiar la vista de contenido, para invocar setNeedsDisplaymétodos, por lo que la vista llamará al método dibujar de nuevo, caché de imagen generada, que se visualiza en la pantalla. Este método no es a menudo o cuando la imagen renderizada en respuesta a una operación del usuario sólo hizo sido útil. Al presentar solamente ver el nuevo contenido cuando sea necesario, se puede ahorrar energía de la batería de equipos, y realizar otras operaciones para el equipo dejando más tiempo.

GLKView_draw_process

Crear y configurar una vista GLKit

Por supuesto, para crear y configurar un objeto GLKView puede pasar a código o Xib. Antes de usarlo para dibujar, hay que asociar un EAGLContextobjeto.
se crea la vista Código, primero crear un contexto, que se pasa a continuación a la vista de initWithFrame:context:método de
carga desde una vista Storyboard, crear un contexto y asigna vista esquemática de contextpropiedades

Ver GLKit crear automáticamente y los objetos de configuración de framebuffer y renderbuffers posee el OpenGL ES. Es posible utilizar una vista a la prestación de propiedades de estos objetos de control de atributos (ejemplo siguiente). En caso de que desee cambiar el tamaño de la vista GLKit, factor de merma Clifford Chance puede dibujar o propiedad, se eliminará automáticamente y volver a crear los objetos de framebuffer apropiadas y renderbuffers la próxima vez que vuelve a dibujar el contenido.

- (void)viewDidLoad{
	[super viewDidLoad];
	// 创建OpenGL ES上下文并赋值给storyboard加载的视图
	GLKView *view = (GLKView *)self.view;
	view.context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
	// 配置视图的renderbuffers
	view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
	view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
	view.drawableStencilFormat - GLKViewDrawableStencilFormat8;
	// 可多重采样
	view.drawableMultisample = GLKViewDrawableMultisample4X;
}

Dibujo con miras GLKit

El código de ejemplo por encima de tres pasos OpenGL ES representación contenido: Preparación de una porción de base OpenGL ES, dibujo de distribución de comando, el contenido de la presentación representada en Core Animation. implementa la clase GLKView el primer paso y el tercer paso, el segundo paso es darse cuenta de que se puede hacer referencia a la siguiente

- (void)drawRect:(CGRect)rect {
	// 清除 framebuffer
	glClearColor(0.0f, 0.0f, 0.1f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// 使用之前配置好的 texture, shader, uniforms, vertex array 绘制
	glBindTexture(GL_TEXTURE_2D, _planetTexture);
	glUseProgram(_diffuseShading);
	glUniformMatrix4fv(_uniformModelViewProjectionMatrix, 1, 0, _modelViewProjectionMatrix.m);
	glBindVertexArrayOES(_planetMesh);
	glDrawElements(GL_TRIANGLE_STRIP, 256, GL_UNSIGNED_SHORT);
}

clase GLKView OpenGL ES representación se puede proporcionar como una interfaz sencilla, es debido a que la gestión de procesos estándar de representación de OpenGL ES:
- método de dibujo antes de la llamada, vistas
+ objeto EAGLContext es el contexto actual
+ de acuerdo con el actual factor de Gentry reducción de tamaño, la propiedad se puede pintar (si es necesario) para crear un objeto de framebuffer y renderbuffers
+ framebuffer objeto de unión que el objetivo de la orden de corriente de drenaje
+ configuración de puerto de vista OpenGL ES para que coincida con el tamaño del uso de este dispositivo
- después de dibujar devuelve el método ver
+ analiza tampón de muestras múltiples (si está activado)
+ Resumen de descartes renderbuffer ya no es necesario
+ renderbuffer representar el contenido y la visualización en caché CoreAniamtion

Utilice prestación objeto proxy

Muchos código de la aplicación de renderizado OpenGL ES en la clase para lograr la auto-definición. La ventaja de este enfoque es que mediante la definición de diferentes clases de representación, es fácil para soportar una pluralidad de algoritmos de representación. algoritmos de representación se pueden compartir heredado de una función de la clase padre. Por ejemplo, es posible utilizar una clase diferente de renderizado compatible con OpenGL ES 2.0 y 3.0. O que sólo podría prestar a medida algoritmos para una mejor calidad de imagen. GLKit ideal para este método, se puede hacer que sus representar los objetos se convierten en una agencia norma ejemplo GLKView. Reemplazar una subclase GLKView e implementar el drawRect: método, sus clases render siguen acuerdo GLKViewDelegate y lograr glkView: drawInRect: método. El ejemplo siguiente

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	// 创建上下文来测试特性
	EAGLContext *context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
	[EAGLContext setCurrentContext: context];
	// 根据设备特性选择一个render类
	GLint maxTextureSize;
	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
	if (maxTextureSize > 2048) {
		self.renderer = [MyBigTextureRender alloc] initWithContext: context];
	} else {
		self.renderer = [MyRenderer alloc] initWithContext: context];
	}
	// 使renderer成为视图的代理
	GLKView *view = (GLKView * )self.window.rootViewController.view;
	view.delegate = self.renderer;
	// 将OpenGL ES上下文给这个视图就可以绘制
	view.context = context;
	return YES;
}

controlador de vista GLKit permite animación contenido OpenGL ES

Típicamente, un objeto GLKView render contenido bajo petición. Esto es una ventaja clave de la utilización de gráficos OpenGL ES es su capacidad para utilizar hardware de gráficos para las escenas complejas de animación continua - pequeñas aplicaciones tales como juegos y simulaciones que muestran imágenes fijas. De estos casos, una vista de la clase controlador de frame GLKit para el objeto se logra mantener ciclo de animación GLKView. El juego sigue la simulación de bucle y patrones de diseño comunes, repartidos en dos etapas: actualizado y se muestra.

update_display_loop

Comprender el ciclo de animación: En la fase de actualización, el controlador llama a su método de actualización (o su representante glkViewControllerUpdate: método). En este método, usted está listo para dibujar el siguiente fotograma. Por ejemplo, un juego podría utilizar este método para determinar la posición del jugador y el personaje enemigo en base a los aportes recibidos después del evento en uno, sino una visualización científica podría utilizar este método para ejecutar un paso de simulación. Si decide que necesita medir el tiempo de la información de estado de la aplicación al siguiente fotograma, el controlador puede ser utilizado como atributo de las propiedades timeSinceLastUpdate tiempo. En la fase de la pantalla: el controlador de vista llama a la vista del método de visualización, método de visualización invoca la vista de la vista de dibujo métodos. En el método de dibujo, que envíe comandos de dibujo OpenGL ES para la GPU para renderizar su contenido. Para un mejor rendimiento, su solicitud debe dirigirse a modificaciones OpenGL ES en el comienzo de una nueva representación de marco, y luego enviar los comandos de dibujo.

tasa de ciclo de animación atributo framesPerSecond indicado por los suplentes controlador de vista entre dos fases. Puede utilizar la propiedad preferredFramesPerSecond para ajustar la velocidad de fotogramas deseada --- con el fin de optimizar el rendimiento del hardware que se muestra actualmente, el controlador de vista seleccionará automáticamente un valor cercano preferido a su velocidad óptima.

controlador de vista Uso GLKit

Una estrategia típica es utilizar las siguientes subclases y ejemplo GLKViewController GLKView OpenGL ES contenidos de animación representación

@implementation PlanetViewController // subclass of GLKViewController
- (void)viewDidLoad {
	[super viewDidLoad];
	// 创建上下文并赋值给视图
	GLKView *view= (GLKView *)self.view;
	view.context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
	// 设置动画帧率
	self.preferredFramesPerSecond = 60;
	// 加载shaders, texttures, vertex arrays, 设置工程矩阵
	[self setupGL];
}
- (void)update{
	_rotation += self.timeSinceLastUpdate * M_PI_2; // 1/4 旋转/s
	// 设置变换矩阵
	GLKMatrix4 modelViewMatrix = GLKMatrix4MakeRotation(_rotation, 0.0f, 1.0f, 0.0f);
	_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
	_modelViewProjectionMatrix = GLKMatrix4Multiply(_projectionMatrix, modelViewMatrix);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
	// 清除framebuffer
	glClearColor(0.0f, 0.0f, 0.1f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// 设置uniforms shader
	glUseProgram(_diffuseShading);
	glUniformMatrix4fv(_uniformModelViewProjectionMatrix, 1, 0, _modelViewProjectionMatrix.m);
	glUniformMatrix3fv(_uniformNormalMatrix, 1, 0, _normalMatrix.m);
	// 使用先前配置的texture, vertex array绘图
	glBindTexture(GL_TEXTURE_2D, _planetTexture);
	glBindVertexArrayOES(_planetMesh);
	glDrawElements(GL_TRIANGLE_STRIP, 256, GL_UNSIGNED_SHORT, 0);
}
@end

Uso GLKit procesador de desarrollo

Además de la vista de la infraestructura y el controlador de vista, el marco GLKit también proporciona varias características adicionales para simplificar el desarrollo de OpenGL ES en IOS
tratada vector y la matriz matemática OpenGL ES2.0 y más tarde no proporciona para crear o especificar conversión incorporado en la matriz de función. Por el contrario, los shaders programables que ofrece la transformación vértice, se puede utilizar una variable de entrada común para especificar el sombreado unificada. GLKit marco incluye un amplio tipos y bibliotecas de vectores y matrices, optimizado para el rendimiento del hardware iOS.
OpenGL ES2.0 y posteriormente eliminado todos asociados con OpenGL ES1.1 de función fija la función de canal de gráficos. Convierte clase GLKBaseEffect tuberías OpenGL ES1.1, iluminación, etapa sombras OC proporciona analógico, y GLKSkyboxEffect GLKReflectionMapEffect clase y añade soporte para los efectos visuales comunes.
GLKTextureLoader clase proporciona un método simple para cargar datos de textura puede ser cualquier formato de imagen, sincrónica o asincrónica de los IOS para apoyar contexto OpenGL ES.

Supongo que te gusta

Origin www.cnblogs.com/tzsh1007/p/12639649.html
Recomendado
Clasificación