zoukankan      html  css  js  c++  java
  • OpenGL简介

    OpenGLwiki  chs),Open Graphics Library,开放图形库,是跨语言、跨平台的3D图形编程接口。

    OpenGL使用客户端 - 服务器架构设计,应用程序为客户端,图形硬件设备为服务器。客户端负责提交OpenGL命令,服务器执行这些命令并渲染出图像。

    OpenGL是一个状态机,每个状态都有一个默认值。开发者可以设置这些状态,然后让它们一直生效,直到再次修改它们。

    例如:当前颜色就是一个状态变量,可以把其设置成红色,那么在此之后绘制的所有物体都会使用这种颜色,直到再次把当前颜色设置为其他颜色。

    OpenGL的API可通过软件模拟实现,高效实现依赖于显示设备厂商提供的硬件加速。注:开源Mesawiki  chs  src)是一个纯软件模拟实现的图形API,其代码兼容于OpenGL。

    OpenGL规范目前由非盈利组织Khronos Groupgithub)的架构评审委员会(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-Registrygithub)和EGL-Registrygithub)下载

    平台有关的附加函数

    在具体操作平台上实现时,除了提供这个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:WindowsSysWOW64 voglv32.dll(32位),C:WindowsSystem32 voglv64.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 StudioVC98IncludeGLGL.H

    Microsoft SDKsWindowsv6.0AincludeGLgl.h

    Windows Kits8.0IncludeumglGL.h

    Windows Kits10Include<10.0.17763.0>umglGL.h

    导入库(32位)(不同windows SDK下的路径):

    Microsoft Visual StudioVC98LibOPENGL32.LIB(vc6)

    Microsoft SDKsWindowsv6.0ALibopengl32.lib

    Windows Kits8.0Libwin8umx86opengl32.lib

    Windows Kits10Lib<10.0.17763.0>umx86opengl32.lib

    导入库(64位)(不同windows SDK下的路径):

    Microsoft Visual StudioVC98LibAMD64OPENGL32.LIB(需安装vc6 x64)

    Microsoft SDKsWindowsv6.0ALibx64opengl32.lib

    Windows Kits8.0Libwin8umx64opengl32.lib

    Windows Kits10Lib<10.0.17763.0>umx64opengl32.lib

    dll(32位):C:WindowsSysWOW64opengl32.dll

    dll(64位):C:WindowsSystem32opengl32.dll

    在Mac OS X中,OpenGL在:/System/Library/Frameworks/OpenGL.framework/OpenGL

    在Linux系统下,OpenGL在:/usr/lib/libGL.so

    工具库

    GLU

    GLU(wikichs),即开放图形库工具库(OpenGL Utility Library)。

    跨平台,对OpenGL核心库进行了封装,提供一些更易于使用的功能,该库中所有函数都以glu为前缀

    在windows平台上,以动态链接库glu32.dll来提供给开发者使用

    默认已被集成windows SDK和windows系统中

    需要注意的是:该库在OpenGL3.1及之后的版本中废弃

    头文件(不同windows SDK下的路径):

    Microsoft Visual StudioVC98IncludeGLGLU.H

    Microsoft SDKsWindowsv6.0AincludeGLglu.h

    Windows Kits8.0Includeumglglu.h

    Windows Kits10Include<10.0.17763.0>umglGLU.h

    导入库(32位)(不同windows SDK下的路径):

    Microsoft Visual StudioVC98LibGlU32.LIB(vc6)

    Microsoft SDKsWindowsv6.0ALibGlU32.lib

    Windows Kits8.0Libwin8umx86GlU32.lib

    Windows Kits10Lib<10.0.17763.0>umx86GlU32.lib

    导入库(64位)(不同windows SDK下的路径):

    Microsoft Visual StudioVC98LibAMD64GlU32.LIB(需安装vc6 x64)

    Microsoft SDKsWindowsv6.0ALibx64GlU32.lib

    Windows Kits8.0Libwin8umx64GlU32.lib

    Windows Kits10Lib<10.0.17763.0>umx64GlU32.lib

    dll(32位):C:WindowsSysWOW64glu32.dll

    dll(64位):C:WindowsSystem32glu32.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 StudioVC98IncludeGLGLAUX.H

    静态库(32位)(vc6):

    Microsoft Visual StudioVC98LibGLAUX.LIB

    静态库(64位)(需安装vc6 x64):

    Microsoft Visual StudioVC98LibAMD64GLAUX.LIB

    GLUT

    GLUT(wikichs),即OpenGL Utility Toolkit,是一个处理OpenGL程序的工具库

    早期的窗口处理库,已不再维护,已被开源的freeglut替代

    可从这里下载源代码和编译好的32位动态库版本

    负责处理和底层操作系统的调用以及I/O,并包括了以下常见的功能:

    ①定义以及控制视窗
    ②侦测并处理键盘及鼠标的事件
    ③以一个函数调用绘制某些常用的立体图形,例如长方体、球、茶壶(实心或网格,如glutWireTeapot())
    ④提供了简单菜单列的实现

    freeglut

    freeglut(wiki),开源的GLUT版本。在windows上,可以静态库或动态库的方式来使用

    跨平台,已开源:http://freeglut.sourceforge.net/

    跨平台窗口和键盘、鼠标处理;API 是 GLUT API 的超集,同时也比GLUT更新、更稳定

    GLFW

    GLFW(wikichs),即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

    GLEWwiki),即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

    GLeewiki),即OpenGL Easy Extension library。跨平台,支持Windows、Mac OS X、Linux及FreeBSD平台

    在初始化时自动对OpenGL扩展和核心函数进行连接,无需开发者手动处理

    目前该库处于无人维护的状态

    glbinding

    glbindingwiki)由C++编写,使用Python脚本和模板文件,并基于OpenGL API规范gl.xml来对OpenGL扩展进行绑定。

    跨平台的,已在github上开源:https://github.com/cginternals/glbinding

  • 相关阅读:
    python基础之数据类型
    简单猜年龄游戏
    python基础之变量
    Python3获取大量电影信息:调用API
    10分钟制作UWP汉堡菜单
    java 异常处理
    多态
    接口与继承
    数组及课后动手动脑
    String类型
  • 原文地址:https://www.cnblogs.com/kekec/p/13527030.html
Copyright © 2011-2022 走看看