我试图显示一个只有两个面的简单三角形,但当我执行它,试图旋转三角形时,没有刷新:(仅当我全屏显示,或最小化和重新最大化时才刷新)

我的代码是:

#include <GL/freeglut.h>
#include <GL/gl.h>
#include <stdio.h>
#include <math.h>//useless but I will need it soon.

float rotx, roty = 0.0f;

char srotx[40];

int win;

void display()
{
    
    glViewport(0,0,1000,800);
    
    glBegin(GL_QUADS);
    glColor3f(0.5,0,0);
    glVertex3f(0.5,0.5,0);
    glColor3f(0,0.5,0);
    glVertex3f(-0.5,0.5,0.5);
    glColor3f(0,0,0.5);
    glVertex3f(0,-0.5,0.5);
    glColor3f(0.5,0.5,0);
    glVertex3f(-0.5,0.5,-0.5);
    glEnd();
    
    glRotatef(rotx,1.0f,0.0f,0.0f);
    glRotatef(roty,0.0f,1.0f,0.0f);
    
    glutSetWindowTitle(srotx);//not working
    glutSwapBuffers();
    
}

void BindInput(unsigned char key, int Mx, int My)
{
    switch(key)
    {
        case 'z' :
            rotx += 0.2f;
            break;
        case 's' :
            rotx -= 0.2f;
            break;
        case 'd' :
            roty += 0.2f;
            break;
        case 'q' :
            roty -= 0.2f;
            break;
    }

    if(key == 27)
    {
        glFinish();
        exit(0);
    }
    if(rotx >= 360.0f || key == 'a' || roty >= 360.0f)
    {
        glutPostWindowRedisplay(win);//testing...
        rotx = 0.0f;
        roty = 0.0f;
    }
    glutPostRedisplay();
}

int main(int argc, char* argv[])
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(1000,800);
  
  sprintf(srotx, "DEBUG Mayo Test, rotx : %f", rotx);
  win = glutCreateWindow(srotx);
  glutSetCursor(GLUT_CURSOR_DESTROY);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glutDisplayFunc(display);
  glutIdleFunc(display);
  glutKeyboardFunc(BindInput);
  glutMainLoop();

  return 0;
 
}

截图: Startingspining it, no refresh

还有tasks.json:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc générer le fichier actif",
            "command": "/usr/bin/gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-lglut",
                "-lGLU",
                "-lGL"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Tâche générée par le débogueur."
        },
    ],
    "version": "2.0.0"
}

我试着在网上搜索,但我找到的所有东西都不起作用.

在Visual Studio代码上使用xubuntu 22.04(X11). 事先感谢您的回复.

推荐答案

简化此示例:

glutPostRedisplay移到空闲回调函数,并在显示回调中使用glClear似乎会给出接近结果的结果.

#include <GL/freeglut.h>
#include <GL/gl.h>

static float rotx, roty;

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0, 0, 1000, 800);

    glBegin(GL_QUADS);
    {
        glColor3f(0.5, 0, 0);
        glVertex3f(0.5, 0.5, 0);

        glColor3f(0, 0.5, 0);
        glVertex3f(-0.5, 0.5, 0.5);

        glColor3f(0, 0, 0.5);
        glVertex3f(0, -0.5, 0.5);

        glColor3f(0.5, 0.5, 0);
        glVertex3f(-0.5, 0.5, -0.5);
    }
    glEnd();

    glRotatef(rotx, 1.0f, 0.0f, 0.0f);
    glRotatef(roty, 0.0f, 1.0f, 0.0f);

    glutSwapBuffers();
}

static void idle(void)
{
    glutPostRedisplay();
}

static void input(unsigned char key, int x, int y)
{
    (void) x;
    (void) y;

    switch (key) {
        case 'z' :
            rotx += 0.2f;
            break;
        case 's' :
            rotx -= 0.2f;
            break;
        case 'd' :
            roty += 0.2f;
            break;
        case 'q' :
            roty -= 0.2f;
            break;
    }

    if (27 == key) {
        glFinish();
        exit(0);
    }

    if ('a' == key || rotx >= 360.0f || roty >= 360.0f) {
        rotx = 0.0f;
        roty = 0.0f;
    }
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(1000, 800);

    glutCreateWindow("example"); // this leaks

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);

    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutKeyboardFunc(input);

    glutMainLoop();
}

object spinning

C++相关问答推荐

是否可以在C中进行D3 D12申请?

我可以动态分配具有空类型函数的矩阵吗?

错误:C中需要参数声明符

标准的C17标准是用括号将参数包装在函数声明中吗

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

如何在C宏中确定 struct 中元素的类型?

我可以在C中声明不同长度数组的数组而不带变量名吗?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

实现简单字典时C语言中的段错误

按长度对argv中的单词进行排序

为什么编译器不能简单地将数据从EDI转移到EAX?

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

在吉陀罗中,_2_1_和CONCAT11是什么意思?

Makefile无法将代码刷新到ATmega328p

C Makefile - 如何避免重复提及文件名

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

如何正确探测平台设备?

为什么需要struct in_addr

malloc:损坏的顶部大小无法找出问题

文件指针引起的C程序分段错误