zoukankan      html  css  js  c++  java
  • OpenGL 信息查询(总结中)

    1、查询OpenGL硬件加速 是否支持

    PIXELFORMATDESCRIPTOR  pfd;
    int  iPixelFormat;

    iPixelFormat = 1;

    // obtain detailed information about
    // the device context's first pixel format
    DescribePixelFormat(hDC, iPixelFormat, 
        sizeof(PIXELFORMATDESCRIPTOR), &pfd);
    if (!(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
        !(pfd.dwFlags & PFD_GENERIC_ACCELERATED))
    {// 启动opengl硬件加速
        MessageBox(NULL,"OpenGL support ICD driver accelerate.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    }

     

    2、WGL扩展
    glGetString( GL_EXTENSIONS )取得的扩展字符串中并不包括针对Windows平台的WGL扩展,WGL扩展串要通过WGL_ARB_extensions_string扩展来获得,以下代码演示了如何获得WGL扩展串:
    定义WGL_ARB_extensions_string扩展新增函数wglGetExtensionsStringARB的函数指针类型,同样这个工作SGI已经为我们做好,只不过不在glext.h中,而在它提供的另外一个头文件 wglext.h 中:
    typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)(
    HDC hdc);
    定义函数指针:
    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;
    检查是否支持WGL_ARB_extensions_string扩展,如果不支持,表示这个显卡不支持WGL扩展,如果支持,则得到wglGetExtensionsStringARB函数的指针,并调用它得到WGL扩展串:
    int hasWGLext = isExtensionSupported("WGL_ARB_extensions_string");
    if (hasWGLext)
    {
    wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) \
    wglGetProcAddress( "wglGetExtensionsStringARB" );
    const char *wglExt = wglGetExtensionsStringARB( hdc );
    ……
    }

     

    3、OpenGL扩展

    OpenGL和Direct3D比较起来,最大的一个长处就是其扩展机制。硬件厂商开发出一个新功能,可以针对新功能开发OpenGL扩展,软件开发人员通过这个扩展就可以使用新的硬件功能。所以虽然显卡的发展速度比OpenGL版本更新速度快得多,但程序员仍然可以通过OpenGL使用最新的硬件功能。而Direct3D则没有扩展机制,硬件的新功能要等到微软发布新版DirectX后才可能支持。
    OpenGL扩展也不是没有缺点,正因为各个硬件厂商都可以开发自己的扩展,所以扩展的数目比较大,而且有点混乱,有些扩展实现的相同的功能,可因为是不同厂商开发的,接口却不一样,所以程序中为了实现这个功能,往往要为不同的显卡写不同的程序。这个问题在OpenGL 2.0出来后可能会得到解决,OpenGL 2.0的一个目标就是统一扩展,减少扩展数目。

     

    每个扩展都有一个扩展名,扩展名类似如下形式:
    GL_ARB_multitexture
    第一段GL,用来表示针对OpenGL哪部分开发的扩展,有以下几个值:
    GL – 针对OpenGL核心的扩展
    WGL – 针对Windows平台的扩展
    GLX – 针对Unix / Linux平台的扩展
    GLU – 针对OpenGL Utility Library的扩展
    第二段ARB,用来表示是谁开发的这个扩展,常见以下几个值:
    ARB – 经OpenGL Architecture Review Board(OpenGL管理机构)正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和ARB扩展,应该优先使用ARB扩展
    EXT – 被多个硬件厂商支持的扩展
    NV – nVIDIA 公司开发的扩展
    ATI – ATI公司开发的扩展
    ATIX– ATI公司开发的实验性扩展
    SGI – Silicon Graphics(SGI)公司开发的扩展
    SGIX– Silicon Graphics(SGI)公司开发的实验性扩展
    第三段multitexture就是真正的扩展名了,如multitexture就是多重纹理扩展。


    要使用一个OpenGL扩展,首先必须检查显卡是否支持这个扩展,以下代码可以获取一个显卡支持的的OpenGL扩展:
    const char *str = glGetString( GL_EXTENSIONS );
    函数返回一个字符串指针,这个字符串就是显卡所支持的所有扩展的扩展名,不同的扩展名之间用空格隔开,形如:
    "GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters ……"
    OpenGL扩展往往都会新增一些函数,在Windows平台上,这些函数不是通过.lib库连接到程序里的,而要在运行时动态获得函数的指针。我们以GL_ARB_point_parameters扩展为例看看怎么获得函数指针。
    首先要定义函数指针类型,
    typedef void (APIENTRY * PFNGLPOINTPARAMETERFARBPROC)(GLenum pname,
    GLfloat param);
    typedef void (APIENTRY * PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname,
    const GLfloat *params);
    这个工作SGI已经为我们做好,它提供了一个头文件 glext.h ,里面有目前绝大多数扩展的常量和函数指针定义,下载下来放到编译器的include/GL文件夹下面,然后在程序里面加上:
    #include <GL/glext.h>
    就可以在程序中使用常量和函数指针类型了。
    然后要定义函数指针:
    PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
    PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;
    再检查显卡是否支持GL_ARB_point_parameters扩展,其中isExtensionSupported是自定义的一个函数,就是在glGetString( GL_EXTENSIONS )返回的字符串里查找是否存在指定的扩展名:
    int hasPointParams = isExtensionSupported("GL_ARB_point_parameters");
    如果支持,就可以用wglGetProcAddress函数获取扩展函数的指针:
    if (hasPointParams)
    {
    glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)\
    wglGetProcAddress( "glPointParameterfEXT" );
    glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) \
    wglGetProcAddress( "glPointParameterfvEXT" );
    }
    最后就可以在程序里使用扩展函数:
    if (hasPointParams)
    {
    static GLfloat quadratic[3] = { 0.25, 0.0, 1/60.0 };
    glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, quadratic);
    glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
    }
    另外,下面代码说明如何访问扩展函数:(资料来源于csdn知识库)
    调用wglGetProcAddress函数访问一个不在标准OpenGL库中的扩展函数。如果该扩展函数存在当前的执行(implementation)中,那么wglGetProcAddress返回一个用来访问该函数的函数指针。否则,wglGetProcAddress返回NULL.
    例如,要访问glAddSwapHintRectWIN扩展函数,如下调用wglGetProcAddress:
    // Get a pointer to the extension function.
    typedef void (WINAPI *FNSWAPHINT)(GLint, GLint, GLsizei, GLsizei);
    fnSwapHint = (FNSWAPHINT)wglGetProcAddress("glAddSwapHintRectWIN");
    // Actual call to glAddSwapHintRectWIN.
    if (fnSwapHint != NULL)
    (*fnSwapHint)(0, 0, 100, 100);

  • 相关阅读:
    20155229 2016-2017-2 《Java程序设计》第九周学习总结
    20155229实验二 《Java面向对象程序设计》实验报告
    10.11课后练习——MyOD系统调用版本
    2017-2018-1 20155223 《信息安全系统设计基础》第5周学习总结
    课堂实践及课后练习9.27@20155223
    2017-2018-1 20155223 《信息安全系统设计基础》第3周学习总结
    20155223 2016-2017-2《Java程序设计》课程总结
    Java第五次实验报告
    课堂代码练习补交
    第四次实验报告
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/1723037.html
Copyright © 2011-2022 走看看