OpenGL学习随笔(十一)

前面的随笔中曾经有过一个疑问——在Windows下如何使用更高版本的OpenGL API。这个疑问在前几天终于被解开,答案即是通过wglGetProcAddress。Windows从95时代开始就只提供了1.1的OpenGL实现,所有高于此的功能,如果被硬件支持则都要使用wglGetProcAddress来调用,该API原型如下:

PROC wglGetProcAddress(
 LPCSTR  lpszProc   // name of the extension function
);

返回值是函数入口地址,输入参数lpszProc即是OpenGL标准或扩展API的名字,大小写必须完全相同。如要使用glWindowPos2d这个1.4中的API,则必须这样调用:

wglGetProcAddress("glWindowPos2d");

如果返回NULL则表示该API在当前环境下不被支持。

glew是一个跨平台(Linux/Mac OS/Windows)的使用OpenGL扩展的函数库,基于它开发者可以直接使用OpenGL API进行编程,glew已经支持OpenGL 3.0的API,当然前提是本地平台或硬件能支持,glew仅是一个包装,并不包括任何OpenGL的软件实现。

关于OpenGL ICD,微软或者SGI都没有公开任何内部信息,目前可以了解到的仅是如下几点:

1、由硬件厂商提供,并在注册表中注册一些信息,位置是HKLM/System/CurrentControlSet/Control/Class/{Adapter GUID}/0000/,字段包括OpenGLDriverName(dll文件名)、OpenGLVersion等。
2、ICD应该有一些抽象接口,这个通过分析opengl32.dll及各厂商所提供的驱动dll可以知道。如DrvCopyContext、DrvGetProcAddress、DrvSwapBuffers,有些接口和GDI驱动接口名字相同,也不知道是否有关联。

以下是一些参考信息:

1. Advanced_Graphics_Programming_Techniques_Using_OpenGL,在历届SIGGRAPH(97-2000)上的一套课程,里面有关于Extension的前后背景
2. Mark J. Kilgard, All About OpenGL Extensions, (http://www.opengl.org/resources/features/OGLextensions/),内容和上一篇有些相似
3. MSDN, Initializing Display Miniport and User-Mode Display Drivers, http://msdn.microsoft.com/en-us/library/ms797580.aspx

猜你喜欢

转载自blog.csdn.net/ison81/article/details/3848862