歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OS X的CAOpenGLLayer中如何啟用OpenGL3.2 core profile

OS X的CAOpenGLLayer中如何啟用OpenGL3.2 core profile

日期:2017/3/1 9:20:09   编辑:Linux編程

在OS X的openGL編程中,我們有時為了想在自己的OpenGL圖層上再加些自己的某些塗層,必須得用CAOpenGLLayer而不是NSOpenGLView,由於在NSOpenGLView上添加任何子視圖都會變得無效。

其實,在CAOpenGLLayer自定義的子類中要追加支持OpenGL Core Profile很簡單,只需要重寫其

- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask

方法即可。如以下代碼所示:

// 重寫父類的方法,提供自己的CGLPixelFormatObj
- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask
{
CGLPixelFormatAttribute attribs[] = {

kCGLPFADisplayMask, 0,
kCGLPFAColorSize, 24,
kCGLPFAAccelerated,
kCGLPFADoubleBuffer,

// Use OpenGL 3.2 Core Profile
kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core,

// Use multi-sample
kCGLPFAMultisample,
kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1,
kCGLPFASamples, (CGLPixelFormatAttribute)4,

0
};
// 將kCGLPFADisplayMask設置為傳遞過來的display mask。這個步驟是必須的!
attribs[1] = mask;

CGLPixelFormatObj pixFormatObj = NULL;
GLint numPixFormats = 0;
CGLChoosePixelFormat(attribs, &pixFormatObj, &numPixFormats);

return pixFormatObj;
}

然後,我們可以在自己的子類中添加對CGLContextObj對象的引用來做一些標記。另外,我們必須重寫CAOpenGLLayer的這個方法:

- (void)drawInCGLContext:(CGLContextObj)glContext

pixelFormat:(CGLPixelFormatObj)pixelFormat

forLayerTime:(CFTimeInterval)timeInterval

displayTime:(const CVTimeStamp *)timeStamp

比如像以下代碼所示:

- (void)drawInCGLContext:(CGLContextObj)glContext
pixelFormat:(CGLPixelFormatObj)pixelFormat
forLayerTime:(CFTimeInterval)timeInterval
displayTime:(const CVTimeStamp *)timeStamp
{
// 這裡必須先將傳進來的上下文作為當前OpenGL執行上下文對象,否則後續對OpenGL的狀態設置都將無效
CGLSetCurrentContext(glContext);

[self setupContext];

// mContext主要用於判別當前OpenGL上下文是否已經設置好,以及在render方法中的引用
mContext = glContext;

[self render];
}

- (void)setupContext是自定義方法,在裡面做頂點設置、全局啟用某些OpenGL功能狀態,並設置viewport等等。

- (void)render也是自定義方法,用來做真正的圖形繪制。

如以下代碼所示:

- (void)render
{
// render
glClear(GL_COLOR_BUFFER_BIT);

glDrawArrays(GL_LINE_STRIP, 0, 721);

glFlush();

CGLFlushDrawable(mContext);
}

隨後,我們自己提供shader代碼,並進行加載即可。這些可以放在setupContext自定義方法中實現。

當然,在OS X中要使用OpenGL core profile必須引入<OpenGL/gl3.h>這個頭文件。目前,3.2 core profile以及4.1 core profile都是用此頭文件。

OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

-------------------------------------分割線-------------------------------------

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm

Copyright © Linux教程網 All Rights Reserved