Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar OpenGL en OS X 10.10

Cómo utilizar OpenGL en OS X 10.10

A partir de OS X Lion (10.7), Apple admite la compatibilidad con OpenGL 3.2 Core Profile. Sin embargo, Core Profile ha cambiado bastante desde Compatible. Ha habido algunos cambios en todo, desde la API del lado del host hasta la interfaz OpenGL y GLSL (OpenGL Shading Language).

Primero, es importante reemplazar de la interfaz del lado del host con .

En segundo lugar, debes agregar los atributos NSOpenGLPFAOpenGLProfile y NSOpenGLProfileVersion3_2Core al objeto NSOpenGLPixelFormatAttribute.

Una vez que haya terminado de dibujar, debe llamar a la interfaz CGL FlushDrawable de la biblioteca CGL para mostrar los resultados de los gráficos renderizados en una vista o ventana.

En términos de uso de la interfaz OpenGL, se deben utilizar VAO y VBO para guardar los datos de los vértices. Entonces, ya no se utilizarán todas las interfaces relacionadas con canalizaciones de función fija. Por lo tanto, estas funciones eliminadas solo se pueden implementar mediante sombreadores.

En el lado GLSL, debe agregar explícitamente el número de versión GLSL, que es al menos 140 (es decir, 1.40), que por defecto es 150 (1.50) en Intel HD Graphics 3000 basado en Sandy Bridge. Luego, dentro y fuera reemplaza los atributos originales y diferentes palabras clave. En los sombreadores de fragmentos, la variable incorporada gl_FragColor se elimina y usted puede definir su propia variable de salida como la salida del último píxel.

A continuación se proporciona un ejemplo de código más básico y conciso:

//

// MyGLView.h

/ / OpenGLShaderBasic

//

// Creado el 4/10/10

// Copyright 2010 GreenGames Studio.

/ /

#import

@interface MyGLView: NSOpenGLView

{

Programa GLuint;

GLuint vbo, vao;

}

- (void)render;

@end

//

///////////////////////////////////////////////// ///// MyGLView.m

// OpenGLShaderBasic

//

// Creado por Zenny Chen el 4/10/10.

// Copyright 2010 GreenGames Studio.

//

#import "MyGLView.h"

// ¡Lo que hay que tener en cuenta aquí! Se debe incluir el archivo de encabezado y reemplazar ; de lo contrario, la interfaz VAO se llamará incorrectamente y los gráficos no se podrán mostrar correctamente.

#import

#define MY_PIXEL_WIDTH 128

#define MY_PIXEL_HEIGHT 128

@implementation MyGLView

p>

// índice de atributos

enum

{

ATTRIB_VERTEX,

NUM_ATTRIBUTES

} ;

- (BOOL)compileShader: (GLint *) tipo de sombreador:(GLenum)tipo de archivo:(NSString *)archivo

{

Estado de GLint;

const GLchar *fuente;

fuente = (GLchar *)[[NSString stringWithContentsOfFile:codificación de archivo:NSUTF8StringEncoding error:nil]]; , &status);

if (status == 0)

Devuelve FALSO

Devuelve VERDADERO;

}

- ( BOOL)loadShaders

{

GLuint vertShader, fragShader;

NSString *vertShaderPathname, *fragShaderPathname;

/ / Crear un programa de sombreado

program = glCreateProgram();

// Vincular la ubicación del atributo

// Esto debe hacerse antes de vincular

glEnlazar

AttribLocation(program, ATTRIB_VERTEX, "inPos");

// Crea y compila el sombreador de vértices

vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@" vsh"];

if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname])

{

NSLog(@"Error al compilar el vértice shader ");

return FALSE;

}

// Crea y compila el sombreador de fragmentos

fragShaderPathname = [[NSBundle mainBundle ] pathForResource:@"Shader" ofType:@"fsh"];

if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname])

{

NSLog(@"Error al compilar el sombreador de fragmentos");

return FALSE;

}

// adjuntar el sombreador de vértices al programa

glAttachShader(programa, vertShader);

// adjunta el sombreador de fragmentos al programa

glAttachShader(programa, fragShader);

//glBindFragDataLocationEXT( programa , 0, "myOutput");

// vincular programa

if (![self linkProgram:program])

{

NSLog(@"Error al vincular el programa:%d", programa);

Devolver FALSE;

}

// Liberar sombreado de vértices y fragmentos

if (vertShader)

glDeleteShader( vertShader);

if (fragShader)

glDeleteShader( fragShader);

Devuelve VERDADERO;

}

- (id)initWithFrame: (NSRect)frameRect

{

self = [ super initWithFrame :frameRect ];

NSOpenGLPixelFormatAttribute attrs[] =

{

NSOpenGLPFADoubleBuffer, // Doble buffer opcional

NSOpenGLPFAOpenGLProfile, // Debe especifique 3.2 Core Profile para usar OpenGL 3.2

NSOpenGLProfileVer

sion3_2Core,

0

};

NSOpenGLPixelFormat *pf = [[ NSOpenGLPixelFormat alloc] initWithAttributes:attrs];

if (! pf)

{

NSLog(@"Sin formato de píxel OpenGL");

}

NSOpenGLContext* contexto = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil];

[self setPixelFormat:pf];

[lanzamiento de pf];

[self setOpenGLContext:context];

[liberación de contexto];

devolver yo;

}

- (void)dealloc

{

if( vbo != 0)

glDeleteFramebuffers(1, &vbo);

if( vao != 0)

glDeleteRenderbuffers (1, &vao);

[super dealloc];

}

- (void)prepareOpenGL

{

[super prepareOpenGL];

[[self openGLContext] makeCurrentContext];

// Sincroniza el intercambio de búfer según la frecuencia de actualización vertical

GLint swapInt = 1;

[[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];

// Aquí está el código de dibujo.

estática constante GLfloat squareVertices[] = {

-1.0f, 1.0f, 0.0f, 1.0f,

-1.0f, -1.0f, 0,0f, 1,0f,

1,0f, 1,0f, 0,0f, 1,0f,

1,0f, -1,0f, -1,0f, 0,0f,

1.0 f, -1.0f, 0.0f, 1.0f

};

// En el archivo de configuración principal de OpenGL 3.2, se deben utilizar objetos de búfer de vértices y matrices de vértices ¡Objeto!

glGenVertexArrays(1, &vao);

glBindVertexArray(vao);

glGenBuffers(1, &vbo);

glBindBuffer(GL_ARRAY_BUFFER , vbo);

glBindBuffer(GL_ARRAY_BUFFER, vbo);

// ¡En el archivo de configuración principal de OpenGL 3.2, se deben usar objetos de búfer de vértices y objetos de matriz de vértices! vbo);

glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);

// Actualizar valores de atributos

glEnableVertexAttribArray(ATTRIB_VERTEX);

glVertexAttribPointer(ATTRIB_VERTEX, 4, GL_FLOAT, 0, 0, (const GLvoid*)0);

// Carga el sombreador y construye el programa. Cargue sombreadores y cree el programa

if(![self loadShaders])

return;

// Utilice el programa de sombreado

glUseProgram( programa);

glViewport(0, 0, MY_PIXEL_WIDTH, MY_PIXEL_HEIGHT);

glViewport(0, 0, MY_PIXEL_WIDTH, MY_PIXEL_HEIGHT) PIXEL_HEIGHT);

glClearColor( 0.5f, 0.5f, 0.5f, 1.0f);

}

- renderizado (vacío)

{

// render

glClear(GL_COLOR_ BUFFER_BIT);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glFlush();

CGLFlushDrawable( [[self openGLContext] CGLContextObj]);

}

@end

Los dos archivos anteriores son los principales archivos de encabezado de ejemplo y fuentes para usar la interfaz OpenGL. documento. En este ejemplo, el contexto OpenGL se basa en una vista (una subclase de NSOpenGLView).

El código fuente del sombreador es el siguiente:

//

// Shader.fsh

// GLSLTest

>/

// Creado por Zenny Chen el 11/4/10.

Copyright GreenGames Studio 2010.

//

// En OpenGL 3.2 Core Profile, el número de versión debe indicarse explícitamente

#version 150

out vec4 myOutput;

void main()

{

//gl_FragColor = vec4(0.1, 0.8, 0.5, 1.0);

myOutput = vec4(0.1, 0.8, 0.5, 1.0);

}

//

// Shader.vsh

// GLSLTest

//

// Creado el 11/04/10.

// Copyright GreenGames Studio 2010.

//

// En OpenGL 3.2 Core Profile, el número de versión debe proporcionarse explícitamente

#version 150

in vec4 inPos;

void main()

{

gl_Position = inPos;

}

El objeto MyGLView en AppDelegate La convocatoria específica es la siguiente.

//

// AppDelegate.h

// OpenGL4Compute

//

// Creado por zenny_chen el 12-12-9.

// Copyright (c) 2012 zenny_chen.

//

#import

@class MyGLView;

@interface AppDelegate: NSObject

{

MyGLView *glComputeObj;

}

@property (asignar) IBOutlet NSWindow *ventana;

@end

//

// AppDelegate.m

// OpenGL4Compute

//

// Creado por zenny_chen el 12-12-9.

// Copyright (c ) 2012 zenny_chen.

//

#import "AppDelegate.h"

#import "MyGLView.h"

@implementation AppDelegate

- (void)dealloc

{

[super dealloc];

}

- ( void)applicationDidFinishLaunching:(NSNotification * )aNotification

{

// Inserta el código aquí para inicializar tu aplicación

NSView *baseView = self.

CGSize viewSize = baseView.frame.0f)];

[botón setButtonType:NSMomentaryPushInButton];

[botón setBezelStyle:NSRoundedBezelStyle]

;

[botón setTitle:@"Mostrar"];

[botón setTarget: self];

[botón setAction:@selector(computeButtonTouched:)]

[baseView addSubview:botón];

[soltar botón];

NSLog(@"La vista es: %@", [self.window. contentView class]) ;

}

- (void) ComputeButtonTouched:(id)sender

{

if(glComputeObj == nil)

{

NSView *baseView = self.window.contentView

CGSize viewSize = baseView.frame.size

glComputeObj;

= [[MyGLView alloc] initWithFrame:CGRectMake((viewSize.width - 128.0f) * 0.5f, (viewSize.height - 128.0f) * 0.5f, 128.0f, 128.0f)];

[ baseView addSubview:glComputeObj];

[lanzamiento de glComputeObj];

}

[glComputeObj performSelector:@selector(render) withObject:nil afterDelay:0.1];

}

@end