zoukankan      html  css  js  c++  java
  • OpenGL之再向虎山行[1]:重学OpenGL

    要说图形学,不是不懂,而是没有系统的学习与复习,所以至今还属于半吊子,随便写些东西,也必须有书在侧。

    再向虎山行,就是想在今年之内圆了梦想,能够有些东西出来。

    >> OpenGL Diagnosis Tool

    做WebService开发时,感觉抓包工具益处良多,所以图形开发也从diagnosis工具开始,这次居然很快就有了功效:

    在一个glDrawRangeElements联系中,居然编译不过,借助于OpenGL Extensions Viewer与Dependency Viewer,原来Windows下根本就不支持。

    http://www.realtech-vr.com/glview/

    比较NB的是,这家伙在Apple AppStore与Mac AppStore上也有。

    可以看到,并不支持OpenGL函数 glDrawRangeElements,用Dependency Walker查看可以印证:

    其实还有什么gDEBugger 之类的,那也太高级了。

    >> 查询OpenGL Information方法

    void queryGlInfomationGLInfo(HDC hdc)
    {
    char* str = 0;
     
    int colorBits[4]; // (r,g,b,a)
    int depthBits;
    int stencilBits;
    int maxTextureSize;
    int maxLights;
    int maxAttribStacks;
    int maxModelViewStacks;
    int maxProjectionStacks;
    int maxClipPlanes;
    int maxTextureStacks;
    int pixelFormat;

    // get vendor string
    str = (char*)glGetString(GL_VENDOR);

    // get renderer string
    str = (char*)glGetString(GL_RENDERER);

    // get version string
    str = (char*)glGetString(GL_VERSION);

    // get all extensions as a string
    str = (char*)glGetString(GL_EXTENSIONS);

    // get number of color bits
    glGetIntegerv(GL_RED_BITS, &colorBits[0]);
    glGetIntegerv(GL_GREEN_BITS,
    &colorBits[1]);
    glGetIntegerv(GL_BLUE_BITS,
    &colorBits[2]);
    glGetIntegerv(GL_ALPHA_BITS,
    &colorBits[3]);

    // get depth bits
    glGetIntegerv(GL_DEPTH_BITS, &depthBits);

    // get stecil bits
    glGetIntegerv(GL_STENCIL_BITS, &stencilBits);

    // get max number of lights allowed
    glGetIntegerv(GL_MAX_LIGHTS, &maxLights);

    // get max texture resolution
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

    // get max number of clipping planes
    glGetIntegerv(GL_MAX_CLIP_PLANES, &maxClipPlanes);

    // get max modelview and projection matrix stacks
    glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &maxModelViewStacks);
    glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH,
    &maxProjectionStacks);
    glGetIntegerv(GL_MAX_ATTRIB_STACK_DEPTH,
    &AttribStacks);

    // get max texture stacks
    glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &info.maxTextureStacks);

    // get the current pixel format
    pixelFormat = GetPixelFormat(hdc);
    }


    >> 跨平台OpenGL Library

    一个glDrawRangeElement的缺失,着实让我学的一个封装良好的OpenGL库很有用处,Google了一把,发现了glext, glew这类东西。

    还是以glew中的glDrawRangeElements为例:

    // Header

    // States
    #define GL_TRIANGLES 0x0004
    #define GL_TRIANGLE_STRIP 0x0005
    #define GL_TRIANGLE_FAN 0x0006
    #define GL_QUADS 0x0007
    #define GL_QUAD_STRIP 0x0008

    //
    Function Pointer
    typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
    #define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)

    GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;

    // Implementation:
    PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL;
    glDrawRangeElements
    = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements"))


    这样一来,就可以直接用glDrawRangeElements,当然了,前提还是要有glDrawRangeElements这个函数导出啊,否则巧妇也难为无米之炊。

    其实,A公司的O库,也有这么一套玩意儿。

    >> GLUT

    http://www.xmission.com/~nate/glut.html

  • 相关阅读:
    制作ubuntu容器完整步骤
    linux系统python3安装pip
    ssh连接服务器提示拒绝了密码
    ubuntu中vi编辑中按键错误
    虚拟机ubuntu连不上网
    NOIP2020退役记
    【NOIp2020游记】
    loki简单安装配置使用
    .net下com调用支持x86/x64
    nginx 504 Gateway Time-out
  • 原文地址:https://www.cnblogs.com/piaoger/p/2182027.html
Copyright © 2011-2022 走看看