C++ 为什么我的屏幕在旋转这个立方体时会闪烁? #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; //屏幕尺寸常数 屏幕宽度=640; 屏幕上的常数=480; bool SetOpenGLAttributes() { //SDL_GL_CONTEXT_CORE只提供较新版本,不推荐使用的函数被禁用 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); 返回true; } int main(int argc,char*args[] { SDL_Window*Window=NULL; //初始化SDL if(SDL_Init(SDL_Init_视频)

C++ 为什么我的屏幕在旋转这个立方体时会闪烁? #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; //屏幕尺寸常数 屏幕宽度=640; 屏幕上的常数=480; bool SetOpenGLAttributes() { //SDL_GL_CONTEXT_CORE只提供较新版本,不推荐使用的函数被禁用 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); 返回true; } int main(int argc,char*args[] { SDL_Window*Window=NULL; //初始化SDL if(SDL_Init(SDL_Init_视频),c++,opengl,sdl,C++,Opengl,Sdl,我正在学习openGL和SDL。我设法让这个“立方体”出现,但它看起来只是一个红色的矩形。我想旋转立方体以确保我的代码实际上正在生成立方体,但是当我旋转然后交换窗口时,立方体只会闪烁。第二个缓冲区窗口似乎是黑色的,但当它再次切换时,它始终是相同的红色矩形。为什么我不能旋转我的立方体,为什么我的第二个缓冲区窗口是黑色的? 清除帧缓冲区并在每次(运行)循环时通过重新绘制多维数据集。 现在,您只需在包含多维数据集的帧缓冲区和空白帧缓冲区之间切换 等等 如果要使用已删除的功能,如glBegin(),请不

我正在学习openGL和SDL。我设法让这个“立方体”出现,但它看起来只是一个红色的矩形。我想旋转立方体以确保我的代码实际上正在生成立方体,但是当我旋转然后交换窗口时,立方体只会闪烁。第二个缓冲区窗口似乎是黑色的,但当它再次切换时,它始终是相同的红色矩形。为什么我不能旋转我的立方体,为什么我的第二个缓冲区窗口是黑色的?

  • 清除帧缓冲区并在每次(运行)循环时通过
    重新绘制多维数据集。
    现在,您只需在包含多维数据集的帧缓冲区和空白帧缓冲区之间切换
  • 等等
  • 如果要使用已删除的功能,如
    glBegin()
    ,请不要请求。这是行不通的
  • 使用
    SDL\u polleevent()
    /
    SDL\u WaitEvent()
    来泵送事件循环,以保持操作系统满意
总而言之:

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <stdio.h>
#include <OpenGL/gl.h>
#include <string.h>
using namespace std;


    //Screen dimension constants
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;


bool SetOpenGLAttributes()
{

    // SDL_GL_CONTEXT_CORE gives us only the newer version, deprecated functions are disabled
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);


    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    return true;
}



    int main( int argc, char* args[] )
    {

        SDL_Window* window = NULL;

        //Initialize SDL
        if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        }
        else
        {
            //Create window
            window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL );
            if( window == NULL )
            {
                printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
            }
            else
            {



                //creating new context
                SDL_GL_CreateContext(window);

                SetOpenGLAttributes();
                SDL_GL_SetSwapInterval(1);

                //cube front
                glBegin(GL_POLYGON);
                glColor3f(1.0, 0.0, 0.0);
                glVertex3f(-.5, .5, -.5);
                glVertex3f(.5, .5, -.5);
                glVertex3f(.5, -.5, -.5);
                glVertex3f(-.5, -.5, -.5);
                glEnd();

                //cube top
                glBegin(GL_POLYGON);
                glColor3f(1.0,0.0,0.0);
                glVertex3f(-.5,.5,-.5);
                glVertex3f(.5, .5, -.5);
                glVertex3f(.5, .5, .5);
                glVertex3f(-.5, .5, .5);
                glEnd();

                //cube bottom
                glBegin(GL_POLYGON);
                glColor3f(1.0, 0.0, 0.0);
                glVertex3f(-.5,-.5,-.5);
                glVertex3f(.5, -.5, -.5);
                glVertex3f(.5, -.5, .5);
                glVertex3f(-.5, -.5, .5);
                glEnd();

                //cube right
                glBegin(GL_POLYGON);
                glColor3f(1.0, 0.0, 0.0);
                glVertex3f(.5, -.5, -.5);
                glVertex3f(.5, -.5, .5);
                glVertex3f(.5, .5, .5);
                glVertex3f(.5, .5, -.5);
                glEnd();

                //cube left
                glBegin(GL_POLYGON);
                glColor3f(1.0, 0.0, 0.0);
                glVertex3f(-.5, -.5, -.5);
                glVertex3f(-.5, .5, -.5);
                glVertex3f(-.5, .5, .5);
                glVertex3f(-.5, -.5, .5);
                glEnd();

                //cube back
                glBegin(GL_POLYGON);
                glColor3f(1.0, 0.0, 0.0);
                glVertex3f(-.5, .5, .5);
                glVertex3f(-.5, -.5, .5);
                glVertex3f(.5, -.5, .5);
                glVertex3f(.5, .5, .5);
                glEnd();

                glFlush();

                SDL_GL_SwapWindow(window);

                bool running = true;
                while(running){
                    glRotatef(1, 1, 0, 0);
                    glFlush();
                    SDL_GL_SwapWindow(window);
                    SDL_Delay(100);

                }


            }
        }


        //Destroy window
        //SDL_DestroyWindow( window );

        //Quit SDL subsystems
        //SDL_Quit();

        return 0;
}
#包括
#包括
#包括
#包括
//屏幕尺寸常数
屏幕宽度=640;
屏幕上的常数=480;
int main(int argc,char*args[]
{
SDL_Window*Window=NULL;
//初始化SDL
if(SDL_Init(SDL_Init_视频)<0)
{
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
返回退出失败;
}
//创建窗口
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
window=SDL\u CreateWindow
(
“SDL教程”,
SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,
屏幕宽度,屏幕高度,
SDL\u窗口\u OPENGL
);
如果(窗口==NULL)
{
printf(“无法创建窗口!SDL_错误:%s\n”,SDL_GetError());
返回退出失败;
}
//创造新环境
SDL_GLContext ctx=SDL_GL_CreateContext(窗口);
SDL_GL_SetSwapInterval(1);
bool running=true;
(跑步时)
{
SDL_事件ev;
while(SDL_事件和ev))
{
if((SDL_QUIT==ev.type)||
(SDL U KEYDOWN==ev.type&&SDLK\U ESCAPE==ev.key.keysym.sym))
{
运行=错误;
打破
}
}
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrix
#include <cstdio>
#include <cstdlib>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
    SDL_Window* window = NULL;

    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        return EXIT_FAILURE;
    }

    //Create window
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    window = SDL_CreateWindow
        (
        "SDL Tutorial",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        SCREEN_WIDTH, SCREEN_HEIGHT,
        SDL_WINDOW_OPENGL
        );
    if( window == NULL )
    {
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        return EXIT_FAILURE;
    }

    //creating new context
    SDL_GLContext ctx = SDL_GL_CreateContext(window);
    SDL_GL_SetSwapInterval(1);

    bool running = true;
    while( running )
    {
        SDL_Event ev;
        while( SDL_PollEvent( &ev ) )
        {
            if( ( SDL_QUIT == ev.type ) ||
                ( SDL_KEYDOWN == ev.type && SDLK_ESCAPE == ev.key.keysym.sym ) )
            {
                running = false;
                break;
            }
        }

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();

        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();

        static float angle = 0.0f;
        angle += 1;
        glRotatef( angle, 0.2, 0.3, 0.1 );

        //cube front
        glBegin(GL_POLYGON);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-.5, .5, -.5);
        glVertex3f(.5, .5, -.5);
        glVertex3f(.5, -.5, -.5);
        glVertex3f(-.5, -.5, -.5);
        glEnd();

        //cube top
        glBegin(GL_POLYGON);
        glColor3f(1.0,0.0,0.0);
        glVertex3f(-.5,.5,-.5);
        glVertex3f(.5, .5, -.5);
        glVertex3f(.5, .5, .5);
        glVertex3f(-.5, .5, .5);
        glEnd();

        //cube bottom
        glBegin(GL_POLYGON);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-.5,-.5,-.5);
        glVertex3f(.5, -.5, -.5);
        glVertex3f(.5, -.5, .5);
        glVertex3f(-.5, -.5, .5);
        glEnd();

        //cube right
        glBegin(GL_POLYGON);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(.5, -.5, -.5);
        glVertex3f(.5, -.5, .5);
        glVertex3f(.5, .5, .5);
        glVertex3f(.5, .5, -.5);
        glEnd();

        //cube left
        glBegin(GL_POLYGON);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-.5, -.5, -.5);
        glVertex3f(-.5, .5, -.5);
        glVertex3f(-.5, .5, .5);
        glVertex3f(-.5, -.5, .5);
        glEnd();

        //cube back
        glBegin(GL_POLYGON);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-.5, .5, .5);
        glVertex3f(-.5, -.5, .5);
        glVertex3f(.5, -.5, .5);
        glVertex3f(.5, .5, .5);
        glEnd();

        SDL_GL_SwapWindow(window);
        SDL_Delay( 16 );
    }

    SDL_GL_DeleteContext(ctx);
    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
main loop:
    reset view
    render
    swap buffers
// Clear Screen And Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset The Current Modelview Matrix
glLoadIdentity();

glTranslatef(0.0f, 0.0f,-7.0f); // Translate Into The Screen 7.0 Units
glRotatef(rotqube,0.0f,1.0f,0.0f);  // Rotate The cube around the Y axis
glRotatef(rotqube,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);      // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f);  // Color Blue
glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f);  // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f);  // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f);  // Color Orange
glVertex3f( 1.0f,-1.0f, 1.0f);  // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f);  // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f);  // Color Red    
glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f);  // Color Yellow
glVertex3f( 1.0f,-1.0f,-1.0f);  // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f);  // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f);  // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f);  // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f);  // Color Blue
glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f);  // Color Violet
glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Right)
glEnd();            // End Drawing The Cube

rotqube +=0.9f;         // Increase Angle