Ну раз говорится про Mac OS, значит программировать будем в cocoa на языке Objective-C. Cоздадим простейшее приложение OpenGL, рисующее на "сцене" куб. Откроем среду разработки XCode и в меню выберем создать новый проект. В списке предложений находим Cocoa Application. Жмем Next.
Выбираем именем рашего проекта CocoaOpenGL и языком разработки объектный си. Далее произвольно заполняем остальные пустые поля. Жмем Next.
Видим "пустой" каркас нашего будущего приложения:
Далее создаем пустые заголовочный и реализующий класс Сube файлы из меню "создать новый файл". Класс Cube и является классом, реализующим OpenGL сцену.
Задаем имя CocoaOpenGL.h . Жмем Next:
Это мы создали заголовочный файл. Теперь аналогично создаем файл реализации(эти оба файла пока пусты):
Жмем Next:
Пишем в поле имени CocoaOpenGL . Жмем Next:
И, наконец, create, мы увидим пустой файл реализации:
Новый заголовочный файл заполняем таким содержимым:
Файл реализации делаем пока таким:@interface Cube : NSOpenGLView
{
bool initialized;
float rotation[3];
}
+ (NSOpenGLPixelFormat*) basicPixelFormat;
- (void) drawRect: (NSRect) bounds;
- (void) resizeGL:(NSRect)rect;
- (id)initWithFrame:(NSRect)frameRect;
@end
#import <Foundation/Foundation.h>Далее заполняем пустые тела функций следующим содержанием. basicPixelFormat :
#import <Cocoa/Cocoa.h>
#import "CocoaOpenGL.h"
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
@implementation Cube
+ (NSOpenGLPixelFormat*) basicPixelFormat{
}
- (void) resizeGL:(NSRect)rect{
}
- (id)initWithFrame:(NSRect)frameRect{
}
- (void)drawRect:(NSRect)rect {
[super drawRect:rect];
// Здесь будет рисующий код
}
@end
static NSOpenGLPixelFormatAttribute attributes[] =initWithFrame :
{
//NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)32,
(NSOpenGLPixelFormatAttribute)nil
};
return ([[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease]);
NSOpenGLPixelFormat *pf;drawRect :
pf = [Cube basicPixelFormat];
self = [super initWithFrame: frameRect pixelFormat: pf];
return (self);
int width, height;
int i, j;
float aspectRatio;
if (!initialized)
{
rotation[0] = 45.0f;
rotation[1] = 45.0f;
rotation[2] = 45.0f;
initialized = true;
}
width = rect.size.width;
height = rect.size.height;
glViewport(0, 0, width, height);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
aspectRatio = (GLfloat)width/(GLfloat)height;
// gluPerspective(100.0f, aspectRatio, 1, 2);
if(width <= height)
{
glOrtho(-2.0f, 2.0f, -2/aspectRatio, 2/aspectRatio, 2.0f, -2.0f);
}
else
{
glOrtho(-2*aspectRatio, 2*aspectRatio, -2.0f, 2.0f, 2.0f, -2.0f);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(rotation[0], 1.0f, 0.0f, 0.0f);
glRotatef(rotation[1], 0.0f, 1.0f, 0.0f);
glRotatef(rotation[2], 0.0f, 0.0f, 1.0f);
// рисуем куб
glEnable(GL_DEPTH_TEST);
glBegin(GL_QUADS);
for (i = 0; i < 6; i ++)
{
glColor3fv(colors[i]);
for (j = 0; j < 4; j ++)
glVertex3fv(corners[sides[i][j]]);
}
glEnd();
glFlush();
//[[self openGLContext]flushBuffer];
Обратите внимание, что функция resizeGL - пуста. Код, который реагирует на изменение собственно сцены (не так в Линуксе и я Windows), находится теле основной рисующей функции drawRect.
Также после директив импорта в файле реализации вставляем такие строки:
Далее идем в Main.storyboard:static const GLfloat corners[8][3] =
{
{ 1.0f, 1.0f, 1.0f }, // Front top right
{ 1.0f, -1.0f, 1.0f }, // Front bottom right
{ -1.0f, -1.0f, 1.0f }, // Front bottom left
{ -1.0f, 1.0f, 1.0f }, // Front top left
{ 1.0f, 1.0f, -1.0f }, // Back top right
{ 1.0f, -1.0f, -1.0f }, // Back bottom right
{ -1.0f, -1.0f, -1.0f }, // Back bottom left
{ -1.0f, 1.0f, -1.0f } // Back top left
};
static const int sides[6][4] =
{
{ 0, 1, 2, 3 }, // Front
{ 4, 5, 6, 7 }, // Back
{ 0, 1, 5, 4 }, // Right
{ 2, 3, 7, 6 }, // Left
{ 0, 3, 7, 4 }, // Top
{ 1, 2, 6, 5 } // Bottom
};
static const GLfloat colors[6][3] =
{
{ 1.0f, 0.0f, 0.0f }, // Red
{ 0.0f, 1.0f, 0.0f }, // Green
{ 1.0f, 1.0f, 0.0f }, // Yellow
{ 0.0f, 0.0f, 1.0f }, // Blue
{ 1.0f, 0.0f, 1.0f }, // Magenta
{ 0.0f, 1.0f, 1.0f } // Cyan
};
Добавляем OpenGL View c хранилища элементов управления главный вид приложения. В правом верхнем углу среды разработки в поле Custom Class указываем на класс Cube (при выделенном элементе управления OpenGL View)
Далее на вкладке Build Settings поле Objective-C Automatic Reference Counting в значение No
Для нашего OpenGL View элемента надо установить поле Depth в любое не-none значение:
Компилируем, запускаем и видим: