有人可以清楚地解释这段代码的作用吗? - OpenGL和SDL

1 c c++ opengl

一般来说,我想找出opengl函数在这段代码中的作用,例如glOrtho();.

我一直在搜索,试图详细了解它们的意思和做法,但我很难找到代码的任何好解释.SDL代码我很好.

我也想知道是否有人能为我描述gltranslatef();

bool init_GL()
{
    glClearColor( 0, 0, 0, 0 );
    //Set projection
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );
    //Initialize modelview matrix
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    //If there was any errors
    if( glGetError() != GL_NO_ERROR )
        return false;
    return true;
}

bool init()
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
        return false;
    //Create Window
    if( SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL ) == NULL )
        return false;
    //Initialize OpenGL
    if( init_GL() == false )
        return false;
    //Set caption
    SDL_WM_SetCaption( "OpenGL Test", NULL );
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这段代码来自lazyfoo教程,但它没有描述很多代码.

非常感谢任何可以提供帮助的人.

dat*_*olf 7

我会为你分解一下:

bool init_GL()
{
Run Code Online (Sandbox Code Playgroud)

我的意思是这个函数init_GL是坏的风格.它所做的一切,实际上都属于绘图功能

    glClearColor( 0, 0, 0, 0 );
Run Code Online (Sandbox Code Playgroud)

glClearColor设置在使用GL_COLOR_BUFFER_BIT设置调用glClear时帧缓冲区将填充(清除)的颜色.

    //Set projection
    glMatrixMode( GL_PROJECTION );
Run Code Online (Sandbox Code Playgroud)

glMatrixMode切换OpenGL矩阵操作函数生效的矩阵.OpenGL知道矩阵"投影","模型视图","纹理"和"颜色".最后两个很少被触及.

    glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)

Load Identity将在矩阵堆栈中的当前位置上放置一个单位矩阵.与向量相乘的单位矩阵将产生完全相同的向量.

    glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );
Run Code Online (Sandbox Code Playgroud)

glOrtho将单位矩阵与正交投影矩阵相乘.一些投影,如正交或仿射透视可以通过线性变换来描述.线性变换可以用矩阵表示.在某种程度上,你可能会认为投影矩阵是OpenGL相机的"镜头"(虽然OpenGL中没有相机!).

    //Initialize modelview matrix
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)

这里矩阵模式切换到Modelview矩阵.Modelview矩阵用于在世界中放置对象(模型)并相对于"相机"移动世界(-view,因此为modelview).

    //If there was any errors
    if( glGetError() != GL_NO_ERROR )
    {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

此错误检查代码是错误的.在OpenGL中,您需要在循环中调用glGetError,直到它返回GL_NO_ERROR.

    return true;
}

bool init()
{

    if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
    {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

初始化SDL库,因此可以使用它.

    //Create Window
    if( SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL ) == NULL )
    {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

SDL_SetVideoMode创建一个窗口(如果在窗口图形系统中,如果在裸帧缓冲区上操作,它将像名称所示,设置视频模式),可能将视频模式更改为另一个显示分辨率(如果在全屏模式下),并创建一个OpenGL上下文.

    //Initialize OpenGL
    if( init_GL() == false )
    {
        return false;
    }

    //Set caption
    SDL_WM_SetCaption( "OpenGL Test", NULL );
Run Code Online (Sandbox Code Playgroud)

最后,这将设置窗口标题.

    return true;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止没有任何东西被渲染 此程序也没有事件循环,因此窗口只会在屏幕上闪烁,消失并且程序终止.