使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序
Posted
技术标签:
【中文标题】使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序【英文标题】:using glutBitmapCharacter() to draw text closing opengl program 【发布时间】:2019-10-31 11:25:26 【问题描述】:当我尝试使用名为drawText()
的函数绘制文本时,该函数运行平稳,但当它到达glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
时,程序意外关闭。我已经测试过它是函数的这个特定部分导致了这个问题,就好像我在哪里删除它并用printf("Hello World!\n");
替换它一样,程序不会崩溃。
主要功能:
int main(void)
GLFWwindow* window;
int width = 840, height = 640;
if (!glfwInit())
printf("failed to init glfw");
return -1;
window = glfwCreateWindow(width, height, "ElectroCraft", NULL, NULL);
glfwMakeContextCurrent(window);
if (!window)
printf("failed to start window");
glfwTerminate();
return -1;
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, 0, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
while (!glfwWindowShouldClose(window))
glClearColor(53.0f / 255.0f, 81.0f / 255.0f, 92.0f / 255.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINES);
glVertex2f(0, height-80);
glVertex2f(width, height - 80);
glEnd();
string text;
text = "Hello World!";
//glutBitmapCharacter(GLUT_BITMAP_9_BY_15, int(text[1]));
drawText(text.data(), text.size(), 50, 100);
glfwSwapBuffers(window);
glfwPollEvents();
glfwTerminate();
return 1;
drawText函数:
void drawText(const char* text, int length, int x, int y)
glMatrixMode(GL_PROJECTION);
double* matrix = new double[16];
glGetDoublev(GL_PROJECTION_MATRIX, matrix);
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glLoadIdentity();
glRasterPos2i(x, y);
for (int i=0; i < length; i++)
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
printf("Hello world!\n");
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(matrix);
glMatrixMode(GL_MODELVIEW);
我不确定是我的代码不是最好的还是 freeglut 库中存在错误。需要明确的是,我正在使用 freeglut。
【问题讨论】:
你不能使用glutBitmapCharacter
而不调用glutInit()
。
“为了清楚,我使用的是 freeglut。”...那你为什么使用 GLFW 函数?
【参考方案1】:
如果你想使用GLUT库的任何函数,那么GLUT必须由glutInit
初始化。例如:
int main(int argc, char** argv)
glutInit(&argc, argv);
// [...]
【讨论】:
什么是 &argc, argv 我为这些论点放了什么 这是应用程序的命令行参数。见Main function。您可以复制/粘贴答案的代码。以上是关于使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序