#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;
}
Я изучаю openGL и SDL. Мне удалось отобразить этот «куб», но он просто выглядит как красный прямоугольник. Я хочу повернуть куб, чтобы убедиться, что мой код фактически создает куб, однако, когда я поворачиваюсь и затем меняю окна, куб только мерцает. Похоже, что второе окно буфера просто черное, но когда оно снова переключается, это всегда один и тот же красный прямоугольник. Почему я не могу повернуть мой куб и почему мое второе окно буфера черного?Почему мой экран мерцает при попытке повернуть этот куб?
Как я могу это сделать в SDL или openGL? Если я повернусь, а затем снова нарисую куб, будет ли он автоматически рисоваться в неактивном буфере? Что вы понимаете, перезагрузившись в единую матрицу? Как мне это сделать? – user2905256
@ user2905256 Я обновил его, чтобы уточнить лучше. Нет, вы никогда не обращаетесь к неактивному буферу. Вы нажимаете на активный, а затем меняете их, чтобы активный стал неактивным и неактивным становится активным. Хотя назвать его «неактивным» может быть обманом, если вы не понимаете, что происходит. Он все еще используется, просто не для рисования; он отображается на мониторе. – Aaron
Что касается SDL, я не использую это или, по крайней мере, не недавно, поэтому я не могу много комментировать аспекты SDL. Однако, я думаю, ваша проблема связана с OpenGL. – Aaron