2014-03-26 45 views
1

在我的项目中,我一直无法在OnRender()内显示一个三角形,但出于某种原因,除背景颜色(绿色)外没有其他任何东西可见。SDL不显示形状

int main(int argc, char **argv) 
{ 
    if (!OnInit()) 
    return -1; 
    SDL_Event Event; 

    while (_isRunning) 
    { 
     while (SDL_PollEvent(&Event)) 
      OnEvent(&Event); 

     OnRender(); 
     OnLoop(); 
     SDL_GL_SwapWindow(_screen); 
    } 

    OnCleanup(); 

    return 0; 
} 

void generalSetup() 
{ 
    // Initialize SDL2 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
     sdldie("Failed to initial SDL2."); 
    else 
    { 
     /* Request OpenGL 3.2 */ 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 

     // Create window 
     _screen = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
     800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);   

     // Create Context 
     _mainContext = SDL_GL_CreateContext(_screen); 

     // Create Surface 
     _surface = SDL_GetWindowSurface(_screen); 
     SDL_FillRect(_surface, NULL, SDL_MapRGB(_surface->format, 0xCC, 0x20, 0x20)); 
     SDL_UpdateWindowSurface(_screen); 

     /* swap synchronized */ 
     SDL_GL_SetSwapInterval(1); 

     // Initialize GLew 1.10 
     glewExperimental = GL_TRUE; 
     GLenum error = glewInit(); 

     if (error != GLEW_OK) 
      printf("Warning: Unable to set VSync! SDL Error: %s\n", SDL_GetError()); 
     else 
      std::cout << "GLew Initialized" << std::endl; 


     glClearColor(0, 1, 0, 0); 

     glViewport(0, 0, 800, 600); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     gluPerspective(45, 800/600, 1, 1000); 
     gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
    } 
} 


bool OnInit() 
{ 
    generalSetup(); 
    return true; 
} 

void OnEvent(SDL_Event* Event) 
{ 
    if (Event->type == SDL_QUIT) 
     _isRunning = false; 
} 

void OnLoop() 
{ 

} 

void OnRender() 
{ 
    glClearColor(1.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushMatrix(); 
    glTranslatef(0.f, 0.f, -10.f); 
    glBegin(GL_TRIANGLES); 
    glColor3f(0.1, 0.2, 0.3); 
    glVertex3f(0, 0, 0); 
    glVertex3f(1, 0, 0); 
    glVertex3f(0, 1, 0); 
    glEnd(); 
    glPopMatrix(); 
} 

void OnCleanup() 
{ 
    SDL_GL_DeleteContext(_mainContext); 
    SDL_DestroyWindow(_screen); 
    SDL_Quit(); 
} 

回答

1

您请求了一个Core上下文。您的直接模式(矩阵堆栈,glBegin()等)的代码都不起作用。

回退到兼容性上下文(SDL_GL_CONTEXT_PROFILE_COMPATIBILITY)或提供Core需要的所有必要的着色器,顶点缓冲区等。

+0

所以一般来说,我最初是为vbos和着色器设置的? – SpicyWeenie

+0

看起来您最初设置为立即模式渲染。虽然我想这取决于你是先编写了'SDL_GL_SetAttribute()'代码还是'OnRender()'。 – genpfault

0

您试图通过即时模式进行渲染,但OpenGL 3.2不支持它。尝试使用支持着色器(如果您打算使用它们)和即时模式的版本2.0或2.1。