SDL不显示形状

时间:2014-03-26 21:09:13

标签: c++ opengl sdl-2

在我的项目中,我一直无法在OnRender()内显示三角形,但出于某种原因,除了背景颜色(绿色)之外,其他任何内容都是可见的。

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();
}

2 个答案:

答案 0 :(得分:1)

您请求了核心上下文。您的立即模式(矩阵堆栈,glBegin()等)代码都不起作用。

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

答案 1 :(得分:0)

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