OpenGL(wiki chs),Open Graphics Library,開放圖形庫,是跨語言、跨平台的3D圖形編程接口。
OpenGL使用客戶端 - 服務器架構設計,應用程序為客戶端,圖形硬件設備為服務器。客戶端負責提交OpenGL命令,服務器執行這些命令並渲染出圖像。
OpenGL是一個狀態機,每個狀態都有一個默認值。開發者可以設置這些狀態,然后讓它們一直生效,直到再次修改它們。
例如:當前顏色就是一個狀態變量,可以把其設置成紅色,那么在此之后繪制的所有物體都會使用這種顏色,直到再次把當前顏色設置為其他顏色。
OpenGL的API可通過軟件模擬實現,高效實現依賴於顯示設備廠商提供的硬件加速。注:開源Mesa(wiki chs src)是一個純軟件模擬實現的圖形API,其代碼兼容於OpenGL。
OpenGL規范目前由非盈利組織Khronos Group(github)的架構評審委員會(Architecture Review Board,ARB)維護。
ARB主要由操作系統廠商(Apple Computer、Microsoft【2003.3已退出】等)、圖形硬件廠商(3Dlabs、SGI、NVIDIA、ATI Technologies、Intel等)、技術公司(Mozilla、Google等)和國際3D組織組成。
OpenGL是一個不斷進化的API,在OpenGL1.2.1版本引入擴展(extension)的概念。OpenGL新版本會定期由Khronos Group發布。
①增加新的擴展API(引入新函數和新常量)來增加新功能
②放松或取消現有擴展API的限制來增強功能
一個擴展由兩部分組成:包含擴展函數原型的頭文件和廠商的設備驅動實現
ARB擴展:標准擴展。由架構評審委員ARB批准發布。第一個ARB擴展是GL_ARB_multitexture(注:在OpenGL1.3中加入)。所有ARB擴展可從這兒查詢。
GL_ARB_multitexture擴展中新增了包含glActiveTextureARB、glClientActiveTextureARB、glMultiTexCoord*ARB函數,共34個。
EXT擴展:通用擴展。硬件供應商同意使用相同的API來實現相同的功能。所有EXT擴展可從這兒查詢。
私有擴展:如NVIDIA的NV擴展,大大增加了OpenGL的靈活性。所有NV擴展可從這兒查詢。
另外,按照平台相關性,擴展還可分類為:與平台無關GL擴展(即:OpenGL核心擴展)和與平台有關的擴展(microsoft windows上為WGL擴展,Mac OS X上為CGL擴展等)
一個擴展的名稱為:XX_YY_ZZ 。其中XX為GL/WGL/CGL/...,YY為ARB/EXT/NV/...,ZZ為擴展的真正名稱
如:GL_ARB_multitexture為一個多紋理的標准OpenGL核心擴展
以下代碼可以獲取當前機器上NVIDIA GeForce 940M顯卡驅動支持的OpenGL擴展
const GLubyte* str = glGetString( GL_EXTENSIONS );
str的內容如下:
GL_AMD_multi_draw_indirect GL_AMD_seamless_cubemap_per_texture GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_bindless_texture GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage GL_ARB_conservative_depth GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_indirect GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_enhanced_layouts GL_ARB_ES2_compatibility GL_ARB_ES3_compatibility GL_ARB_ES3_1_compatibility GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_no_attachments GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_NV_internalformat_sample_query GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_seamless_cubemap_per_texture GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counters GL_ARB_shader_bit_encoding GL_ARB_shader_draw_parameters GL_ARB_shader_group_vote GL_ARB_shader_image_load_store GL_ARB_shader_image_size GL_ARB_shader_objects GL_ARB_shader_precision GL_ARB_query_buffer_object GL_ARB_shader_storage_buffer_object GL_ARB_shader_subroutine GL_ARB_shader_texture_image_samples GL_ARB_shader_texture_lod GL_ARB_shading_language_100 GL_ARB_shading_language_420pack GL_ARB_shading_language_include GL_ARB_shading_language_packing GL_ARB_shadow GL_ARB_sparse_buffer GL_ARB_sparse_texture GL_ARB_stencil_texturing GL_ARB_sync GL_ARB_tessellation_shader GL_ARB_texture_barrier GL_ARB_texture_border_clamp GL_ARB_texture_buffer_object GL_ARB_texture_buffer_object_rgb32 GL_ARB_texture_buffer_range GL_ARB_texture_compression GL_ARB_texture_compression_bptc GL_ARB_texture_compression_rgtc GL_ARB_texture_cube_map GL_ARB_texture_cube_map_array GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_ARB_texture_gather GL_ARB_texture_mirror_clamp_to_edge GL_ARB_texture_mirrored_repeat GL_ARB_texture_multisample GL_ARB_texture_non_power_of_two GL_ARB_texture_query_levels GL_ARB_texture_query_lod GL_ARB_texture_rectangle GL_ARB_texture_rg GL_ARB_texture_rgb10_a2ui GL_ARB_texture_stencil8 GL_ARB_texture_storage GL_ARB_texture_storage_multisample GL_ARB_texture_swizzle GL_ARB_texture_view GL_ARB_timer_query GL_ARB_transform_feedback2 GL_ARB_transform_feedback3 GL_ARB_transform_feedback_instanced GL_ARB_transform_feedback_overflow_query GL_ARB_transpose_matrix GL_ARB_uniform_buffer_object GL_ARB_vertex_array_bgra GL_ARB_vertex_array_object GL_ARB_vertex_attrib_64bit GL_ARB_vertex_attrib_binding GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_vertex_type_10f_11f_11f_rev GL_ARB_vertex_type_2_10_10_10_rev GL_ARB_viewport_array GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_texture_float GL_ATI_texture_mirror_once GL_S3_s3tc GL_EXT_texture_env_add GL_EXT_abgr GL_EXT_bgra GL_EXT_bindable_uniform GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_Cg_shader GL_EXT_depth_bounds_test GL_EXT_direct_state_access GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXTX_framebuffer_mixed_formats GL_EXT_framebuffer_multisample_blit_scaled GL_EXT_framebuffer_object GL_EXT_framebuffer_sRGB GL_EXT_geometry_shader4 GL_EXT_gpu_program_parameters GL_EXT_gpu_shader4 GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EXT_packed_float GL_EXT_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_polygon_offset_clamp GL_EXT_provoking_vertex GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_shader_objects GL_EXT_separate_specular_color GL_EXT_shader_image_load_formatted GL_EXT_shader_image_load_store GL_EXT_shader_integer_mix GL_EXT_shadow_funcs GL_EXT_stencil_two_side GL_EXT_stencil_wrap GL_EXT_texture3D GL_EXT_texture_array GL_EXT_texture_buffer_object GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_latc GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_integer GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_shared_exponent GL_EXT_texture_sRGB GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_texture_swizzle GL_EXT_timer_query GL_EXT_transform_feedback2 GL_EXT_vertex_array GL_EXT_vertex_array_bgra GL_EXT_vertex_attrib_64bit GL_EXT_import_sync_object GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat GL_KHR_context_flush_control GL_KHR_debug GL_KHR_robust_buffer_access_behavior GL_KHR_robustness GL_KTX_buffer_region GL_NV_bindless_multi_draw_indirect GL_NV_bindless_multi_draw_indirect_count GL_NV_bindless_texture GL_NV_blend_equation_advanced GL_NV_blend_equation_advanced_coherent GL_NV_blend_square GL_NV_command_list GL_NV_compute_program5 GL_NV_conditional_render GL_NV_copy_depth_to_color GL_NV_copy_image GL_NV_depth_buffer_float GL_NV_depth_clamp GL_NV_draw_texture GL_NV_ES1_1_compatibility GL_NV_ES3_1_compatibility GL_NV_explicit_multisample GL_NV_fence GL_NV_float_buffer GL_NV_fog_distance GL_NV_fragment_program GL_NV_fragment_program_option GL_NV_fragment_program2 GL_NV_framebuffer_multisample_coverage GL_NV_geometry_shader4 GL_NV_gpu_program4 GL_NV_gpu_program4_1 GL_NV_gpu_program5 GL_NV_gpu_program5_mem_extended GL_NV_gpu_program_fp64 GL_NV_gpu_shader5 GL_NV_half_float GL_NV_light_max_exponent GL_NV_multisample_coverage GL_NV_multisample_filter_hint GL_NV_occlusion_query GL_NV_packed_depth_stencil GL_NV_parameter_buffer_object GL_NV_parameter_buffer_object2 GL_NV_path_rendering GL_NV_pixel_data_range GL_NV_point_sprite GL_NV_primitive_restart GL_NV_register_combiners GL_NV_register_combiners2 GL_NV_shader_atomic_counters GL_NV_shader_atomic_float GL_NV_shader_atomic_int64 GL_NV_shader_buffer_load GL_NV_shader_storage_buffer_object GL_NV_texgen_reflection GL_NV_texture_barrier GL_NV_texture_compression_vtc GL_NV_texture_env_combine4 GL_NV_texture_multisample GL_NV_texture_rectangle GL_NV_texture_shader GL_NV_texture_shader2 GL_NV_texture_shader3 GL_NV_transform_feedback GL_NV_transform_feedback2 GL_NV_uniform_buffer_unified_memory GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_attrib_integer_64bit GL_NV_vertex_buffer_unified_memory GL_NV_vertex_program GL_NV_vertex_program1_1 GL_NV_vertex_program2 GL_NV_vertex_program2_option GL_NV_vertex_program3 GL_NVX_conditional_render GL_NVX_gpu_memory_info GL_NVX_nvenc_interop GL_NV_shader_thread_group GL_NV_shader_thread_shuffle GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_SGIS_generate_mipmap GL_SGIS_texture_lod GL_SGIX_depth_texture GL_SGIX_shadow GL_SUN_slice_accum GL_WIN_swap_hint WGL_EXT_swap_control
另外,可使用OpenGL Extensions Viewer來查看當前機器上顯卡驅動支持的OpenGL擴展的信息,該工具有Windows(下載),Mac OS X、Android和iOS版本
核心庫
OpenGL核心庫中,有兩類函數:平台無關的gl函數和平台有關的附加函數
平台無關的gl函數
所有以gl為前綴的函數都是跨平台的,與平台無關的,這些函數共有300多個
以microsoft windows平台上opengl32.dll為例,該dll中共有337個gl函數,這些gl函數最后會調用ICD(Installable Client Drivers)顯卡驅動接口來實現相關功能
glAccum glAlphaFunc glAreTexturesResident glArrayElement glBegin glBindTexture glBitmap glBlendFunc glCallList glCallLists glClear glClearAccum glClearColor glClearDepth glClearIndex glClearStencil glClipPlane glColor3b glColor3bv glColor3d glColor3dv glColor3f glColor3fv glColor3i glColor3iv glColor3s glColor3sv glColor3ub glColor3ubv glColor3ui glColor3uiv glColor3us glColor3usv glColor4b glColor4bv glColor4d glColor4dv glColor4f glColor4fv glColor4i glColor4iv glColor4s glColor4sv glColor4ub glColor4ubv glColor4ui glColor4uiv glColor4us glColor4usv glColorMask glColorMaterial glColorPointer glCopyPixels glCopyTexImage1D glCopyTexImage2D glCopyTexSubImage1D glCopyTexSubImage2D glCullFace glDebugEntry glDeleteLists glDeleteTextures glDepthFunc glDepthMask glDepthRange glDisable glDisableClientState glDrawArrays glDrawBuffer glDrawElements glDrawPixels glEdgeFlag glEdgeFlagPointer glEdgeFlagv glEnable glEnableClientState glEnd glEndList glEvalCoord1d glEvalCoord1dv glEvalCoord1f glEvalCoord1fv glEvalCoord2d glEvalCoord2dv glEvalCoord2f glEvalCoord2fv glEvalMesh1 glEvalMesh2 glEvalPoint1 glEvalPoint2 glFeedbackBuffer glFinish glFlush glFogf glFogfv glFogi glFogiv glFrontFace glFrustum glGenLists glGenTextures glGetBooleanv glGetClipPlane glGetDoublev glGetError glGetFloatv glGetIntegerv glGetLightfv glGetLightiv glGetMapdv glGetMapfv glGetMapiv glGetMaterialfv glGetMaterialiv glGetPixelMapfv glGetPixelMapuiv glGetPixelMapusv glGetPointerv glGetPolygonStipple glGetString glGetTexEnvfv glGetTexEnviv glGetTexGendv glGetTexGenfv glGetTexGeniv glGetTexImage glGetTexLevelParameterfv glGetTexLevelParameteriv glGetTexParameterfv glGetTexParameteriv glHint glIndexMask glIndexPointer glIndexd glIndexdv glIndexf glIndexfv glIndexi glIndexiv glIndexs glIndexsv glIndexub glIndexubv glInitNames glInterleavedArrays glIsEnabled glIsList glIsTexture glLightModelf glLightModelfv glLightModeli glLightModeliv glLightf glLightfv glLighti glLightiv glLineStipple glLineWidth glListBase glLoadIdentity glLoadMatrixd glLoadMatrixf glLoadName glLogicOp glMap1d glMap1f glMap2d glMap2f glMapGrid1d glMapGrid1f glMapGrid2d glMapGrid2f glMaterialf glMaterialfv glMateriali glMaterialiv glMatrixMode glMultMatrixd glMultMatrixf glNewList glNormal3b glNormal3bv glNormal3d glNormal3dv glNormal3f glNormal3fv glNormal3i glNormal3iv glNormal3s glNormal3sv glNormalPointer glOrtho glPassThrough glPixelMapfv glPixelMapuiv glPixelMapusv glPixelStoref glPixelStorei glPixelTransferf glPixelTransferi glPixelZoom glPointSize glPolygonMode glPolygonOffset glPolygonStipple glPopAttrib glPopClientAttrib glPopMatrix glPopName glPrioritizeTextures glPushAttrib glPushClientAttrib glPushMatrix glPushName glRasterPos2d glRasterPos2dv glRasterPos2f glRasterPos2fv glRasterPos2i glRasterPos2iv glRasterPos2s glRasterPos2sv glRasterPos3d glRasterPos3dv glRasterPos3f glRasterPos3fv glRasterPos3i glRasterPos3iv glRasterPos3s glRasterPos3sv glRasterPos4d glRasterPos4dv glRasterPos4f glRasterPos4fv glRasterPos4i glRasterPos4iv glRasterPos4s glRasterPos4sv glReadBuffer glReadPixels glRectd glRectdv glRectf glRectfv glRecti glRectiv glRects glRectsv glRenderMode glRotated glRotatef glScaled glScalef glScissor glSelectBuffer glShadeModel glStencilFunc glStencilMask glStencilOp glTexCoord1d glTexCoord1dv glTexCoord1f glTexCoord1fv glTexCoord1i glTexCoord1iv glTexCoord1s glTexCoord1sv glTexCoord2d glTexCoord2dv glTexCoord2f glTexCoord2fv glTexCoord2i glTexCoord2iv glTexCoord2s glTexCoord2sv glTexCoord3d glTexCoord3dv glTexCoord3f glTexCoord3fv glTexCoord3i glTexCoord3iv glTexCoord3s glTexCoord3sv glTexCoord4d glTexCoord4dv glTexCoord4f glTexCoord4fv glTexCoord4i glTexCoord4iv glTexCoord4s glTexCoord4sv glTexCoordPointer glTexEnvf glTexEnvfv glTexEnvi glTexEnviv glTexGend glTexGendv glTexGenf glTexGenfv glTexGeni glTexGeniv glTexImage1D glTexImage2D glTexParameterf glTexParameterfv glTexParameteri glTexParameteriv glTexSubImage1D glTexSubImage2D glTranslated glTranslatef glVertex2d glVertex2dv glVertex2f glVertex2fv glVertex2i glVertex2iv glVertex2s glVertex2sv glVertex3d glVertex3dv glVertex3f glVertex3fv glVertex3i glVertex3iv glVertex3s glVertex3sv glVertex4d glVertex4dv glVertex4f glVertex4fv glVertex4i glVertex4iv glVertex4s glVertex4sv glVertexPointer glViewport
隨着OpenGL不斷發展,后續新gl函數通過GL擴展來提供給開發者使用。
新gl函數聲明在glext.h中,glext.h及其依賴的khrplatform.h可以從OpenGL Register頁面下載
可在代碼中動態獲取glext.h中GL_ARB_multitexture擴展的glMultiTexCoord2fARB函數的調用地址 注:該函數的實現體也在ICD動態鏈接庫中,但是無法通過depends工具看到
#include <gl/glext.h> const char* str = (const char*)glGetString( GL_EXTENSIONS );//獲取當前機器上顯卡驅動支持的所有OpenGL擴展 if (strstr(str, "GL_ARB_multitexture") != NULL)//判斷是否支持GL_ARB_multitexture擴展 { PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress( "glMultiTexCoord2fARB" ); if (glMultiTexCoord2fARB != NULL)//判斷GL_ARB_multitexture擴展是否實現glMultiTexCoord2fARB函數 { glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0,0); } }
注:更多API代碼可從OpenGL-Registry(github)和EGL-Registry(github)下載
平台有關的附加函數
在具體操作平台上實現時,除了提供這個gl為前綴與平台無關的函數外,還提供一些與平台有關的附加函數
microsoft windows上平台有關的函數前綴為wgl,Mac OS X為cgl,Android等手機平台為egl
X Window(GNOME和KDE都是以X窗口系統為基礎開發而成),帶圖形界面的linux、unix系統基本都是使用X Window,前綴為glx
下文以microsoft windows平台上的wgl為例,進行詳細說明
在windows平台上,wgl函數的聲明在wingdi.h中,GDI調用opengl32.dll,opengl32.dll調用ICD(Installable Client Drivers)顯卡驅動接口來實現相關功能,對應關系如下:
GDI OpenGL ICD
ChoosePixelFormat wglChoosePixelFormat
wglCopyContext wglCopyContext DrvCopyContext
wglCreateContext wglCreateContext DrvCreateContext
wglCreateLayerContext wglCreateLayerContext DrvCreateLayerContext
wglDeleteContext wglDeleteContext DrvDeleteContext
wglDescribeLayerPlane wglDescribeLayerPlane DrvDescribeLayerPlane
DescribePixelFormat wglDescribePixelFormat DrvDescribePixelFormat
wglGetCurrentContext wglGetCurrentContext
wglGetCurrentDC wglGetCurrentDC
wglGetDefaultProcAddress
wglGetLayerPaletteEntries wglGetLayerPaletteEntries DrvGetLayerPaletteEntries
GetPixelFormat wglGetPixelFormat
wglGetProcAddress wglGetProcAddress DrvGetProcAddress
DrvPresentBuffers
wglMakeCurrent wglMakeCurrent
wglRealizeLayerPalette wglRealizeLayerPalette DrvRealizeLayerPalette
DrvReleaseContext
DrvSetCallbackProcs
DrvSetContext
wglSetLayerPaletteEntries wglSetLayerPaletteEntries DrvSetLayerPaletteEntries
SetPixelFormat wglSetPixelFormat DrvSetPixelFormat
wglShareLists wglShareLists DrvShareLists
SwapBuffers wglSwapBuffers DrvSwapBuffers
wglSwapLayerBuffers wglSwapLayerBuffers DrvSwapLayerBuffers
DrvValidateVersion
wglSwapMultipleBuffers wglSwapMultipleBuffers
wglUseFontBitmapsA wglUseFontBitmapsA
wglUseFontBitmapsW wglUseFontBitmapsW
wglUseFontOutlinesA wglUseFontOutlinesA
wglUseFontOutlinesW wglUseFontOutlinesW
我本機NVIDIA GeForce 940M顯卡的ICD動態鏈接庫C:\Windows\SysWOW64\nvoglv32.dll(32位),C:\Windows\System32\nvoglv64.dll(64位)
隨着OpenGL不斷發展,wgl的函數接口也在不斷地增加中。在windows平台上,這些新wgl函數通過WGL擴展來提供給開發者使用。
新wgl函數聲明在wglext.h中 注1:wglext.h可從OpenGL Register頁面下載 注2:使用X windows的圖形界面的linux、unix系統下載glxext.h
可在代碼中動態獲取wglext.h中WGL_EXT_swap_control擴展的wglGetSwapIntervalEXT函數的調用地址 注:該函數的實現體也在ICD動態鏈接庫中,但是無法通過depends工具看到
#include <gl/wglext.h> if (strstr(str, "WGL_EXT_swap_control") != NULL)//判斷是否支持WGL_EXT_swap_control擴展 { PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress( "wglGetSwapIntervalEXT" ); if (wglGetSwapIntervalEXT != NULL)//判斷WGL_EXT_swap_control擴展是否實現wglGetSwapIntervalEXT函數 { int swapInterval = wglGetSwapIntervalEXT(); } }
在windows平台上,以動態鏈接庫OpenGL32.dll來提供給開發者使用。默認已被集成windows SDK和windows系統中。
頭文件(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Include\GL\GL.H
Microsoft SDKs\Windows\v6.0A\include\GL\gl.h
Windows Kits\8.0\Include\um\gl\GL.h
Windows Kits\10\Include\<10.0.17763.0>\um\gl\GL.h
導入庫(32位)(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Lib\OPENGL32.LIB(vc6)
Microsoft SDKs\Windows\v6.0A\Lib\opengl32.lib
Windows Kits\8.0\Lib\win8\um\x86\opengl32.lib
Windows Kits\10\Lib\<10.0.17763.0>\um\x86\opengl32.lib
導入庫(64位)(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Lib\AMD64\OPENGL32.LIB(需安裝vc6 x64)
Microsoft SDKs\Windows\v6.0A\Lib\x64\opengl32.lib
Windows Kits\8.0\Lib\win8\um\x64\opengl32.lib
Windows Kits\10\Lib\<10.0.17763.0>\um\x64\opengl32.lib
dll(32位):C:\Windows\SysWOW64\opengl32.dll
dll(64位):C:\Windows\System32\opengl32.dll
在Mac OS X中,OpenGL在:/System/Library/Frameworks/OpenGL.framework/OpenGL
在Linux系統下,OpenGL在:/usr/lib/libGL.so
工具庫
GLU
GLU(wiki,chs),即開放圖形庫工具庫(OpenGL Utility Library)。
跨平台,對OpenGL核心庫進行了封裝,提供一些更易於使用的功能,該庫中所有函數都以glu為前綴
在windows平台上,以動態鏈接庫glu32.dll來提供給開發者使用
默認已被集成windows SDK和windows系統中
需要注意的是:該庫在OpenGL3.1及之后的版本中廢棄
頭文件(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Include\GL\GLU.H
Microsoft SDKs\Windows\v6.0A\include\GL\glu.h
Windows Kits\8.0\Include\um\gl\glu.h
Windows Kits\10\Include\<10.0.17763.0>\um\gl\GLU.h
導入庫(32位)(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Lib\GlU32.LIB(vc6)
Microsoft SDKs\Windows\v6.0A\Lib\GlU32.lib
Windows Kits\8.0\Lib\win8\um\x86\GlU32.lib
Windows Kits\10\Lib\<10.0.17763.0>\um\x86\GlU32.lib
導入庫(64位)(不同windows SDK下的路徑):
Microsoft Visual Studio\VC98\Lib\AMD64\GlU32.LIB(需安裝vc6 x64)
Microsoft SDKs\Windows\v6.0A\Lib\x64\GlU32.lib
Windows Kits\8.0\Lib\win8\um\x64\GlU32.lib
Windows Kits\10\Lib\<10.0.17763.0>\um\x64\GlU32.lib
dll(32位):C:\Windows\SysWOW64\glu32.dll
dll(64位):C:\Windows\System32\glu32.dll
窗口及消息處理相關的庫
OpenGL上下文(OpenGL context)的創建過程相當復雜,在不同的操作系統上也需要不同的做法。
很多用戶界面庫(如:FLTK、Qt )提供了自動創建 OpenGL 上下文的功能
當然,也有一些庫是專門用來創建OpenGL 窗口的。windows上最早的是GLAUX;跨平台最早的是GLUT,后被 freeglut 取代,比較新的還有GLFW。
GLAUX
GLAUX是OpenGL輔助庫。
只能在windows平台上使用,主要封裝了windows平台上窗口和鍵盤、鼠標處理
以GLAUX.LIB靜態庫的方式來使用,該庫中所有函數都以aux為前綴
目前這個庫已經過時,只有比較少的編譯環境中(如vc6)有提供。
頭文件(vc6):
Microsoft Visual Studio\VC98\Include\GL\GLAUX.H
靜態庫(32位)(vc6):
Microsoft Visual Studio\VC98\Lib\GLAUX.LIB
靜態庫(64位)(需安裝vc6 x64):
Microsoft Visual Studio\VC98\Lib\AMD64\GLAUX.LIB
GLUT
GLUT(wiki,chs),即OpenGL Utility Toolkit,是一個處理OpenGL程序的工具庫
早期的窗口處理庫,已不再維護,已被開源的freeglut替代
可從這里下載源代碼和編譯好的32位動態庫版本
負責處理和底層操作系統的調用以及I/O,並包括了以下常見的功能:
①定義以及控制視窗
②偵測並處理鍵盤及鼠標的事件
③以一個函數調用繪制某些常用的立體圖形,例如長方體、球、茶壺(實心或網格,如glutWireTeapot())
④提供了簡單菜單列的實現
freeglut
freeglut(wiki),開源的GLUT版本。在windows上,可以靜態庫或動態庫的方式來使用
跨平台,已開源:http://freeglut.sourceforge.net/
跨平台窗口和鍵盤、鼠標處理;API 是 GLUT API 的超集,同時也比GLUT更新、更穩定
GLFW
GLFW(wiki,chs),即Graphics Library Framework(圖形庫框架),配合OpenGL使用的輕量級工具程序庫。
在windows上,可以靜態庫或動態庫的方式來使用
跨平台,已在github開源:https://github.com/glfw/glfw
提供了在windows已編譯好的32位/64位的靜態庫與動態庫版本,可以從這里下載
主要功能是創建並管理窗口和OpenGL上下文,同時還提供了處理手柄、鍵盤、鼠標輸入的功能。
加載OpenGL擴展相關的庫
在程序的運行期利用動態加載技術(dlsym、GetProcAddress等函數),來判斷當前硬件是否支持相關的擴展。
gl3w
gl3w是最簡單從Khronos的核心頭文件生成擴展函數API的方法,它通過Python腳本gl3w_gen.py從OpenGL Register頁面下載glcorearb.h及其依賴的khrplatform.h,並生成gl3w.h和gl3w.c供開發者使用
注:不同機器上,生成出來的gl3w.h和gl3w.c的內容都是一樣的
glcorearb.h必須和gl.h放在同一目錄中,而且在通過#include <GL/glcorearb.h>來使用
glcorearb.h中僅僅包含最新核心頭文件中包含的函數,不包含一些從最新核心頭文件中去除的固定管線用到的函數
另外,不要在同一個源文件中包含glcorearb.h和gl.h、glext.h;也就是說glcorearb.h與gl.h、glext.h是互斥的,它為{gl.h + glext.h - 廢棄函數}的函數集合
跨平台,已在github開源:https://github.com/skaslev/gl3w
GLEW
GLEW(wiki),即OpenGL Extension Wrangler Library,方便查詢和加載OpenGL擴展
跨平台,已在github開源:https://github.com/nigels-com/glew
提供了在windows已編譯好的32位/64位的動態庫版本,可以從這里下載
提供高效運行時機制來判斷某個OpenGL擴展是否在目標平台上支持
依據官方的擴展列表來機器生成所有OpenGL擴展到單一頭文件
GLEW帶有以下2個工具:
visualinfo.exe:輸出當前機器顯卡驅動所支持OpenGL版本及擴展的概要信息,支持哪些像素格式的輸出
+-----+-------------------------+-----------------+----------+-----------------+----------+ | | visual | color | ax dp st | accum | layer | | id | tp ac gd fm db sw st ms | sz r g b a | bf th cl | sz r g b a | ov un sw | +-----+-------------------------+-----------------+----------+-----------------+----------+ | 1 | wp fu . i . . . . | 32 8 8 8 . | 4 24 . | 64 16 16 16 16 | . . . | | 2 | wp fu . i . . . . | 32 8 8 8 8 | 4 24 . | 64 16 16 16 16 | . . . | | 3 | wp fu . i . . . . | 32 8 8 8 . | 4 24 8 | 64 16 16 16 16 | . . . | | 4 | wp fu . i . . . . | 32 8 8 8 8 | 4 24 8 | 64 16 16 16 16 | . . . | | 5 | wp fu . i . . . . | 32 8 8 8 . | 4 . . | 64 16 16 16 16 | . . . | | 6 | wp fu . i . . . . | 32 8 8 8 8 | 4 . . | 64 16 16 16 16 | . . . | | 7 | wp fu . i y x . . | 32 8 8 8 . | 4 24 . | 64 16 16 16 16 | . . . | | 8 | wp fu . i y x . . | 32 8 8 8 8 | 4 24 . | 64 16 16 16 16 | . . . | | 9 | wp fu . i y x . . | 32 8 8 8 . | 4 24 8 | 64 16 16 16 16 | . . . | | 10 | wp fu . i y x . . | 32 8 8 8 8 | 4 24 8 | 64 16 16 16 16 | . . . | | 11 | wp fu . i y x . . | 32 8 8 8 . | 4 . . | 64 16 16 16 16 | . . . | | 12 | wp fu . i y x . . | 32 8 8 8 8 | 4 . . | 64 16 16 16 16 | . . . | | 13 | wp fu . i y c . . | 32 8 8 8 . | 4 24 . | 64 16 16 16 16 | . . . | | 14 | wp fu . i y c . . | 32 8 8 8 8 | 4 24 . | 64 16 16 16 16 | . . . | | 15 | wp fu . i y c . . | 32 8 8 8 . | 4 24 8 | 64 16 16 16 16 | . . . | | 16 | wp fu . i y c . . | 32 8 8 8 8 | 4 24 8 | 64 16 16 16 16 | . . . | | 17 | wp fu . i y c . . | 32 8 8 8 . | 4 . . | 64 16 16 16 16 | . . . | | 18 | wp fu . i y c . . | 32 8 8 8 8 | 4 . . | 64 16 16 16 16 | . . . | | 19 | wp fu . i y x . 2 | 32 8 8 8 . | 4 24 . | 64 16 16 16 16 | . . . | | 20 | wp fu . i y x . 2 | 32 8 8 8 8 | 4 24 . | 64 16 16 16 16 | . . . | | 21 | wp fu . i y x . 2 | 32 8 8 8 . | 4 24 8 | 64 16 16 16 16 | . . . |
** visual ~= pixel format descriptor
** id = visual id (integer from 1 - max visuals)
** tp = type (wn: window, pb: pbuffer, wp: window & pbuffer, bm: bitmap)
** ac = acceleration (ge: generic, fu: full, no: none)
** fm = format (i: integer, f: float, c: color index)
** db = double buffer (y = yes)
** sw = swap method (x: exchange, c: copy, u: undefined)
** st = stereo (y = yes)
** sz = total # bits
** r = # bits of red
** g = # bits of green
** b = # bits of blue
** a = # bits of alpha
** axbf = # aux buffers
** dpth = # bits of depth
** stcl = # bits of stencil
glewinfo.exe:輸出當前機器顯卡驅動所支持所有OpenGL版本及擴展包含的函數API的詳細信息 注:支持為OK,不支持則為MISSING
GLee
GLee(wiki),即OpenGL Easy Extension library。跨平台,支持Windows、Mac OS X、Linux及FreeBSD平台
在初始化時自動對OpenGL擴展和核心函數進行連接,無需開發者手動處理
目前該庫處於無人維護的狀態
glbinding
glbinding(wiki)由C++編寫,使用Python腳本和模板文件,並基於OpenGL API規范gl.xml來對OpenGL擴展進行綁定。
跨平台的,已在github上開源:https://github.com/cginternals/glbinding