Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么glClear不';你不能清除我的屏幕吗?_C_Opengl - Fatal编程技术网

为什么glClear不';你不能清除我的屏幕吗?

为什么glClear不';你不能清除我的屏幕吗?,c,opengl,C,Opengl,这是我编写的一个简单的opengl程序。在画三角形之前,我正试图清除屏幕上的阴影。我在init()函数中调用了glClear(),但是,它似乎无法清除屏幕 #include <stdio.h> #include <stdlib.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> void myIdleFunc() { glBegin(GL_TRIANGL

这是我编写的一个简单的opengl程序。在画三角形之前,我正试图清除屏幕上的阴影。我在init()函数中调用了glClear(),但是,它似乎无法清除屏幕

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void myIdleFunc()
{
    glBegin(GL_TRIANGLES);
    {
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex2f(0.0f, 1.0f);
        glVertex2f(-1.0f, -1.0f);
        glVertex2f(1.0f, -1.0f);
    }
    glEnd();

    glFlush();

    usleep(1000000);
}

void init()
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutCreateWindow("Hello, World!");

    init();

    glutIdleFunc(myIdleFunc);
    glutMainLoop();
    return 1;
}
#包括
#包括
#包括
#包括
#包括
void myIdleFunc()
{
glBegin(GL_三角形);
{
GL3F(1.0f,1.0f,1.0f);
glVertex2f(0.0f,1.0f);
glVertex2f(-1.0f,-1.0f);
glVertex2f(1.0f,-1.0f);
}
格伦德();
glFlush();
美国LEEP(1000000);
}
void init()
{
glClearColor(0.0f、0.0f、0.0f、1.0f);
glClear(GLU颜色缓冲位);
glFlush();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_单个);
“你好,世界!”;
init();
glutIdleFunc(myIdleFunc);
glutMainLoop();
返回1;
}
这是一个屏幕截图,文本来自后台的gnome终端


您的显示回调在哪里?绘制时不应使用idle函数

所有绘图都需要在适当的回调中进行,GL上下文可能在
glutMainLoop
开始运行之前不处于活动状态,如果没有活动上下文,您的命令将被忽略(如果没有上下文,甚至可能没有存储错误以供使用
glGetError
检索的位置)


注意:通常需要在每一帧的开头清除缓冲区。使用单缓冲可能只清除一次,但双缓冲更好,需要您以某种方式渲染每次交换之间的整个区域。

我不使用GLUT,但显示类似内容的一种非常简单的方法是:

while( !done ) { /* Loop until done. Do drawing. */     

    glClear( GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glBegin(GL_TRIANGLES);
    {
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex2f(0.0f, 1.0f);
        glVertex2f(-1.0f, -1.0f);
        glVertex2f(1.0f, -1.0f);
    }
    glEnd();

    glFlush();
    SwapBuffers( );

    etc... event handling....
}

您的问题是,您确实清除了初始化代码中的屏幕。但是您需要在每一帧清除它,所以就在显示(或在您的情况下为空闲)功能的开始处。

运行此代码,您可能会得到解决方案

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>

double x_0 = -100;
double y_0 = -25;

double x_1 = 100;
double y_1 = -25;

double x_2 = 100;
double y_2 = 25;

double x_3 = -100;
double y_3 = 25;

void
init(void)
{
    /*initialize the x-y co-ordinate*/
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-320, 319,-240, 239);
    glClear(GL_COLOR_BUFFER_BIT);

    glFlush();
}

void
drawRectangle()
{
    glBegin(GL_LINES);

    glVertex2d(x_0, y_0);
    glVertex2d(x_1, y_1);

    glVertex2d(x_1, y_1);
    glVertex2d(x_2, y_2);

    glVertex2d(x_2, y_2);
    glVertex2d(x_3, y_3);

    glVertex2d(x_3, y_3);
    glVertex2d(x_0, y_0);

    glEnd();
    glFlush();
}

int
main(int argc, char *argv[])
{
    double x_0, y_0, x_1, y_1;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(400, 400);

    glutCreateWindow("Clear Screen");
    init();
    drawRectangle();
    /* clear the screen. You can uncomment following three lines to view the effect of clearing */
//  glClearColor(0, 0, 0, 0);
//  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//  /* don't forget to flush */
//  glFlush();
    /***/
    glutMainLoop();
}

谢谢为什么不使用idle函数进行绘图?我的意思是我需要反复画这个三角形。当没有什么特别的事情发生时,显示功能不是在绘图吗?@tr:我不知道,我不使用GLUT。但是失败的代码不在任何回调中,而是在GLUT开始循环之前,因此GL可能还没有准备好使用。上下文在glutCreateWindow中创建和激活,而不是在glutMainLoop中。因此,他的代码可以正常工作(但并非如他所愿)。@Christian:你说得对,上下文是活动的,文档说“在创建窗口后,可以立即更改窗口关联OpenGL上下文的状态。”但它还说“渲染已创建的窗口是无效的,因为该窗口尚未显示。”,因此,在进入
glMainLoop
@trVoldemort:只需从空闲函数调用glutPostRedisplay()时,可能会调整窗口的大小(并重新分配上下文的帧缓冲区)。glClear属于显示功能;OpenGL不维护某种场景表示,它只执行绘图命令。像您这样的OpenGL init()函数通常也不是一种好的OpenGL编码风格。这看起来真的很不错。也许你应该这样说:)
gcc file.c -lglut -lGLU -lGL
./a.out