opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明相关的知识,希望对你有一定的参考价值。

参考技术A 刚入门opengl的时候最烦的就是各种库的配置,glut, freeglut, glfw, glew , glad , gl3w 等等,简直要晕了. 最后查阅网上的资料大概得出了这样的结论:

opengl仅仅是一个标准/规范,但是具体利用opengl开发对应的应用则需要依赖具体的开发环境例如windows, linux等, 而最常见的就是窗口, IO控制等交互逻辑,因此glut, freeglut, glfw这类的库便产生了

opengl是一个标准/规范, 具体的实现是由驱动开发商针对特定的显卡而实现.支持opengl的驱动版本众多,大多数函数的地址(内存地址)无法在编译时候确定下来,需要运行的时候查询.所以在运行的时候获取函数的内存地址并把其保存在一个函数指针中供后续使用. glew, glad, gl3w基本都是实现类似的功能

结论: 可以用上面两类的库进行组合,例如我自己常用的是glfw + glad来进行opengl的开发, 也有很多开发者使用的是glfw + gl3w, 或者 glfw + glew

使用 GLUT 在 3D OpenGL 世界中显示固定位置的 2D 文本

【中文标题】使用 GLUT 在 3D OpenGL 世界中显示固定位置的 2D 文本【英文标题】:Displaying fixed location 2D text in a 3D OpenGL world using GLUT 【发布时间】:2013-09-17 10:14:45 【问题描述】:

我有一个 OpenGL 项目,它使用 GLUT(不是 freeglut),我想在固定位置的视口上显示 2D 文本。我的其余对象都在 3D 世界坐标中。

This answer 对一个相关的旧问题说,

GLUT 附带的位图字体是简单的 2D 字体,不适合在 3D 环境中显示。但是,它们非常适合需要覆盖在显示窗口上的文本。

我已经尝试了接受的答案中概述的方法,但它没有给我想要的输出。下面是显示函数的一段代码sn-p:

void display()

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glLoadIdentity();  
  glTranslatef(0.0, 0.0, -(dis+ddis));   //Translate the camera
  glRotated(elev+delev, 1.0, 0.0, 0.0);  //Rotate the camera
  glRotated(azim+dazim, 0.0, 1.0, 0.0);  //Rotate the camera

       .
       .
       .
  draw 3D scene
       .
       .
       .

  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  gluOrtho2D(0.0, win_width, 0.0, win_height);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
  glRasterPos2i(10, 10);
  string s = "Some text";
  void * font = GLUT_BITMAP_9_BY_15;
  for (string::iterator i = s.begin(); i != s.end(); ++i)
  
    char c = *i;
    glColor3d(1.0, 0.0, 0.0);
    glutBitmapCharacter(font, c);
  
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();

  glFlush();
  glSwapBuffers();

similar question 似乎已被问及我想要什么,但作者没有接受任何答案。

一般来说,答案似乎建议使用其他库(主要是操作系统特定的)来实现覆盖。但是,没有明确的迹象表明单独使用GLUT 是否可以实现这一点。能做到吗?

【问题讨论】:

好吧,如果它旋转,您在glLoadIdentity()glutBitmapCharacter 之间有一些对glRotatefglMultMatrix 的调用。您应该只渲染您的 3D 场景,然后执行您发布的第一个答案所建议的一切。 我已经尝试过了,但这会覆盖渲染的 3D 场景,并且只是在空白屏幕中显示文本。 您不应该在两者之间致电 glClearswapBuffers。我们可以继续猜测问题是什么,或者您可以发布一个最小的代码示例来说明什么不起作用。 您发布的代码对我有用,您的问题似乎出在其他地方。 当你说它有效时,你是否在绘制 3D 场景并旋转相机时仍然得到覆盖? 【参考方案1】:

我在使用 glut 创建太阳系模型时遇到了同样的问题。这是我解决它的方法:(使用上面的代码)

glDisable(GL_TEXTURE_2D); //added this
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0, win_width, 0.0, win_height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(10, 10);
string s = "Some text";
void * font = GLUT_BITMAP_9_BY_15;
for (string::iterator i = s.begin(); i != s.end(); ++i)

  char c = *i;
  glColor3d(1.0, 0.0, 0.0);
  glutBitmapCharacter(font, c);

glMatrixMode(GL_PROJECTION); //swapped this with...
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //...this
glPopMatrix();
//added this
glEnable(GL_TEXTURE_2D);

你会注意到我在接近尾声时切换了glMatrixMode(GL_PROJECTION);glMatrixMode(GL_MODELVIEW);。我决定这样做是因为this website。我还必须用glDisable(GL_TEXTURE_2D)glEnable(GL_TEXTURE_2D) 包围代码部分。

希望有帮助 - 我为我工作。我的太阳系使用类来执行所有这些,我很乐意应要求分享更多详细信息。

【讨论】:

【参考方案2】:

正如我所说,您发布的代码运行良好。这是我用来测试它的代码:

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include "GL/glu.h"
//glm not required
//#include <glm.hpp>
//#include <gtc/matrix_transform.hpp>
#include <string>

int win_width = 500, win_height = 500;

void renderScene(void) 

    static float dis=0, ddis=0, elev=0, delev=0, azim=0, dazim=0;

    azim += 0.5f;
    if (azim >= 360.0f)
        azim -= 360.0f;
    

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -(dis + ddis));
    glRotated(elev + delev, 1.0, 0.0, 0.0);
    glRotated(azim + dazim, 0.0, 1.0, 0.0);
    glScalef(2.0f,2.0f,2.0f);

    glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(-0.5f, -0.5f, 0.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(0.5f, 0.0f, 0.0f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.0f, 0.5f, 0.0f);
    glEnd();


    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    //I like to use glm because glu is deprecated
    //glm::mat4 orth= glm::ortho(0.0f, (float)win_width, 0.0f, (float)win_height);
    //glMultMatrixf(&(orth[0][0]));
    gluOrtho2D(0.0, win_width, 0.0, win_height);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glColor3f(1.0f, 0.0f, 0.0f);//needs to be called before RasterPos
    glRasterPos2i(10, 10);
    std::string s = "Some text";
    void * font = GLUT_BITMAP_9_BY_15;

    for (std::string::iterator i = s.begin(); i != s.end(); ++i)
    
        char c = *i;
        //this does nothing, color is fixed for Bitmaps when calling glRasterPos
        //glColor3f(1.0, 0.0, 1.0); 
        glutBitmapCharacter(font, c);
    
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glEnable(GL_TEXTURE_2D);

    glutSwapBuffers();
    glutPostRedisplay();


int main(int argc, char **argv) 

    // init GLUT and create Window
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(win_width, win_height);
    glutCreateWindow("GLUT Test");

    // register callbacks
    glutDisplayFunc(renderScene);

    // enter GLUT event processing cycle
    glutMainLoop();

    return 1;

关于已弃用的固定功能管道和其他的常见免责声明适用。

【讨论】:

感谢您的代码。它帮助我调试了我的程序。我还没有准确地找到问题所在,但是我绘制的 3D 场景似乎存在一些问题。接受这个,因为它回答了问题。【参考方案3】:

有一个棘手的方法可以解决您的问题。

请在调用函数之前编写代码或如下所示:

glutBitmaCharacter(font, ' ');// 

是吗……!它应该可以工作......

【讨论】:

以上是关于opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明的主要内容,如果未能解决你的问题,请参考以下文章

GLUT死了吗?

FreeGlut OpenGL 上下文版本

glDrawArrays 仅在原点绘制一个点(在 ubuntu 上带有 glut 的 OpenGL)

QT一个最简单的openGL例子

glfw 包含了opengl吗

从位图图像中读取2D纹理(C ++,OpenGL)