Tag: 过剩

我如何一起使用GTK和过剩?

我知道为了编写GTK应用程序,我编写了一堆代码来描述主窗口中的内容,然后我调用: gtk_main(); 此后的任何代码语句都不会被执行。 现在让我们假设我喜欢我的GTK应用程序显示我用glut编写的内容,它本身包含一堆关于需要设置图形的语句等等,然后以语句结束: glutMainLoop(); 之后的任何事情都没有执行。 所以我的问题是这两个语句中的任何一个都阻止我调用另一个。 有没有办法在GTK小部件中执行过剩主循环? 有没有办法编写一个代码,可以某种方式同时调用GTK主循环和glut主循环(但从主程序调用并在单独的X窗​​口中呈现,而不是在小部件内)? 我有一种感觉,这可以通过“线程”来完成……

在OpenGL中,我可以绘制一个完全在坐标(5,5)处的像素吗?

通过(5,5)我的意思是第五行和第五列。 我发现使用屏幕坐标绘制东西非常困难,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间。 为什么阻止程序员使用屏幕坐标/窗口坐标是如此严重?

恒定的游戏速度独立于OpenGL与GLUT中的可变FPS?

我一直在阅读Koen Witters关于不同游戏循环解决方案的详细文章 ,但是我在使用GLUT实现最后一个时遇到了一些问题,这是推荐的。 在阅读了几篇关于如何实现恒定游戏速度的文章,教程和代码之后,我认为我目前已实现的内容(我将在下面发布代码)是Koen Witters所谓的Game Speed依赖于可变FPS ,第二篇关于他的文章。 首先,通过我的搜索经验,有几个人可能有帮助,但不知道什么是GLUT,我将尝试解释(随意纠正我)相关的function我的这个OpenGL工具包的问题。 如果您知道GLUT是什么以及如何使用它,请跳过此部分。 GLUT工具包: GLUT是一个OpenGL工具包,可以帮助完成OpenGL中的常见任务。 glutDisplayFunc(renderScene)接受一个指向renderScene()函数回调的指针,该回调将负责渲染所有内容。 renderScene()函数仅在回调注册后调用一次。 glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)在调用回调processAnimationTimer()之前需要经过的毫秒数。 最后一个参数只是一个传递给计时器回调的值。 processAnimationTimer()不会在每个TIMER_MILLISECONDS而只需调用一次。 glutPostRedisplay()函数请求GLUT渲染一个新帧,所以每当我们改变场景中的某些东西时我们都需要调用它。 glutIdleFunc(renderScene)可用于向renderScene()注册回调(这不会使glutDisplayFunc()无关)但应避免使用此函数,因为在未接收到事件时会持续调用空闲回调,从而增加CPU负载。 glutGet(GLUT_ELAPSED_TIME)函数返回自调用glutGet(GLUT_ELAPSED_TIME)或首次调用glutGet(GLUT_ELAPSED_TIME) )以来的毫秒数。 那是GLUT的计时器。 我知道高分辨率计时器还有更好的选择,但是现在让我们继续使用这个计时器。 我认为这是关于GLUT如何渲染帧的足够信息,所以那些不了解它的人也可以在这个问题中投入试图帮助它们如果它们像它一样堕落。 目前的实施: 现在,我不确定我是否正确实施了Koen提出的第二种解决方案, 游戏速度依赖于可变FPS 。 相关代码如下: #define TICKS_PER_SECOND 30 #define MOVEMENT_SPEED 2.0f const int TIMER_MILLISECONDS = 1000 / TICKS_PER_SECOND; int previousTime; int currentTime; int elapsedTime; void renderScene(void) { (…) // Setup […]

在OpenGL中更改投影

我在调整GLUT窗口大小时遇到​​了麻烦。 我想打印一个矩形但是当我使用resizefunction时,我似乎无法在窗口中绘制和塑造。 我有以下代码,当我调整窗口大小时我想改变方形的宽度,但如果高度resize,我不希望它的高度改变。 #include #include #include /* globals */ GLsizei wh = 500, ww = 500; /* initial window size */ GLfloat size = 3.0; /* half side length of square */ void myinit(void) { glClearColor(0.0,0.0,1.0,1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,1,0,1.0,-1.0,1.0); glViewport(0,0,ww,wh); } /* display callback — required by GLUT 3.0 */ void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | […]

C中的GLUT屏幕截图

我正在尝试在GLUT中进行屏幕捕获,我遇到了一些问题。 glReadPixels()似乎使我的程序崩溃了 Access violoation writing location 0x00000000 奇怪的是文件是在项目的根目录中创建的,显然是空的。 我快速设置了一些printf命令,看起来代码在glReadPixels()方法中每次崩溃。 我觉得问题可能是变量’像素’。 我无法找出定义它的正确方法,以便将RGB值写入其中。 任何提示将不胜感激。 void savePPM(char ppmFileName[]){ int width = glutGet(GLUT_WINDOW_WIDTH); int height = glutGet(GLUT_WINDOW_HEIGHT); char *pixels = NULL; glReadPixels(0,0, width, height, GL_RGB, GL_UNSIGNED_BYTE ,pixels); ppmFile = fopen(ppmFileName, “wb”); fprintf(ppmFile, “P6\n”); fprintf(ppmFile, “%d %d\n”, width, height); fprintf(ppmFile, “255\n”); fwrite(pixels, 1, width*height*3, ppmFile); fclose(ppmFile); free(pixels); }

opengl:如何在调整窗口大小时将对象保留在窗口中

我正在使用Bresenham的中点算法作为家庭作业在OpenGL上使用MS绘画类应用程序。 到目前为止,我可以绘制线条和椭圆。 在调整窗口大小时,我失去了它们。 我怎样才能让他们画出来? 完整代码: #include “GL/glut.h” #include #include int i; //int mainWindow, subWindow; int X1, Y1, X2, Y2; int modoDeDibujo; int W = 1000, H = 1000; /*void menuApp (int value) { if (value == 1) printf(“Linea\n”); if (value == 2) printf(“Circulo\n”); if (value == 3) printf(“Elipsis\n”); if (value == 4) exit(0); } void […]

Opengl在3d场景问题上绘制2d覆盖图

我有一个移动的3D场景设置,我想制作一个永远在顶部的固定2d GUI覆盖,当我尝试制作2d形状时,我什么也看不到。 当我调用:glMatrixMode(GL_PROJECTION); 我的3D场景消失了,我留下了一个空白的窗口…… 这是我用于叠加层的代码 编辑:更新的代码 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glColor3f(1, 1, 1); glPushMatrix(); glBegin(GL_QUADS); glVertex3f(-5.0f, 5.0f, 0.0f); glVertex3f(-5.0f, -5.0f, 0.0f); glVertex3f(5.0f, -5.0f, 0.0f); glVertex3f(5.0f, 5.0f, 0.0f); glEnd(); glPopMatrix(); glEnable(GL_DEPTH_TEST); glutSwapBuffers();