2014-03-26 2 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

코어 컨텍스트를 요청했습니다. 직접 모드 (매트릭스 스택, glBegin() 등) 코드는 작동하지 않습니다.

호환성 컨텍스트 (SDL_GL_CONTEXT_PROFILE_COMPATIBILITY)로 돌아가거나 코어에 필요한 모든 쉐이더, 버텍스 버퍼 등을 제공하십시오.

+0

그래서 일반적으로 vbos 및 쉐이더를 원래 설정 했습니까? – SpicyWeenie

+0

직접 모드 렌더링을 위해 원래 설정된 것처럼 보입니다. 나는 당신이'SDL_GL_SetAttribute()'코드를 먼저 작성했는지 아니면'OnRender()'를 작성했는지에 달려 있다고 생각한다. – genpfault

0

직접 모드를 통해 렌더링하려하지만 OpenGL 3.2에서는 지원되지 않습니다. 셰이더 (사용하려는 경우)와 직접 모드를 모두 지원하는 버전 2.0 또는 2.1을 사용해보십시오.

관련 문제