Cómo utilizar OpenGL en OS X 10.10
Primero, es importante reemplazar
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.
/ / p>
#import
@interface MyGLView: NSOpenGLView
{
Programa GLuint;
GLuint vbo, vao;
}
- (void)render;
@end
// p>
///////////////////////////////////////////////// ///// 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
#import
#define MY_PIXEL_WIDTH 128
#define MY_PIXEL_HEIGHT 128
@implementation MyGLView p>
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); p>
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) p>
{
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