• OpenGL 扩展及应用


    【注】在网上看的一篇博客,介绍的很详细,帮助我解决了问题,原文地址:http://apps.hi.baidu.com/share/detail/6251493

    每个扩展都有一个扩展名,扩展名类似如下形式:

    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就是多重纹理扩展。

    2.2使用OpenGL扩展

    要使用一个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( "glPointParameterfARB" );//这是我自己试验过的,如果用原文中的EXT程序报错
      glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) wglGetProcAddress( "glPointParameterfvARB" );
    }

    最后就可以在程序里使用扩展函数:

    if (hasPointParams)
    {
      static GLfloat quadratic[3] = { 0.25, 0.0, 1/60.0 };
      glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);//原文中没有POINT,不对
      glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
    }

  • 相关阅读:
    使用VMware Workstation和Virtual Network Editor管理虚拟网络
    关于VMware虚拟机的上网问题[Workstation版本] [备用]
    verycd上的一些视频课程
    什么是HD , HDTV , BD(BluRay) , HDDVD
    Vim 统计(利用自身替换的副作用)
    zz再谈“安防IT化”
    浙江大学-英特尔嵌入式技术中心成立
    shell脚本条件测试与比较
    shell脚本特殊变量与变量子串相关知识
    Linux基础和帮助
  • 原文地址:https://www.cnblogs.com/lihuiyy/p/2278469.html
Copyright © 2020-2023  润新知