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

Can somebody explain clearly what this code does? - OpenGL & SDL

本文关键字:作用 SDL OpenGL 代码 清楚 解释 段代码      更新时间:2023-10-16

一般来说,我想找出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;
}

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

非常感谢任何能帮助我的人。

我来给你解释一下:

bool init_GL()
{

这个函数,我的意思是init_GL,是糟糕的风格。它所做的一切,实际上都属于绘图函数

    glClearColor( 0, 0, 0, 0 );

glClearColor设置帧缓冲区将被填充的颜色(clear),当使用GL_COLOR_BUFFER_BIT设置调用glClear时。

    //Set projection
    glMatrixMode( GL_PROJECTION );

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

    glLoadIdentity();

Load Identity将在矩阵堆栈的当前位置上放置一个单位矩阵。一个单位矩阵与一个向量相乘,将得到相同的向量。

    glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );

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

    //Initialize modelview matrix
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

这里矩阵模式切换到Modelview矩阵。Modelview矩阵用于在世界中放置对象(model-)和相对于"相机"移动世界(-view,因此是Modelview)。

    //If there was any errors
    if( glGetError() != GL_NO_ERROR )
    {
        return false;
    }

这个错误检查代码是错误的。在OpenGL中,你必须在循环中调用glGetError,直到它返回GL_NO_ERROR。

    return true;
}
bool init()
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
    {
        return false;
    }

初始化SDL库,以便使用。

    //Create Window
    if( SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL ) == NULL )
    {
        return false;
    }

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

    //Initialize OpenGL
    if( init_GL() == false )
    {
        return false;
    }
    //Set caption
    SDL_WM_SetCaption( "OpenGL Test", NULL );

最后设置窗口标题。

    return true;
}

到目前为止还没有渲染。这个程序也缺少事件循环,所以窗口只会在屏幕上闪烁,然后消失,程序终止。

基本上可以说glOrtho和glTranslate都产生与当前渲染矩阵相乘的矩阵。最终的渲染矩阵将用于转换场景中的所有顶点,这将影响照明,裁剪,透视。最后,所有这些矩阵控制对象呈现到屏幕上的方式。

使用这些(与许多其他矩阵函数一起),您可以缩放,旋转,翻译对象在您的场景和控制,如果你应该使用正交(平行)投影或透视投影。你可以在这里阅读:

glOrtho:

glOrtho描述了一个产生平行投影的变换。当前矩阵(参见glMatrixMode)乘以这个矩阵结果替换当前矩阵

gltranslatef:

glTranslate通过(x, y, z)生成一个翻译。电流矩阵(见glMatrixMode)乘以平移矩阵

但我认为,如果你真的想学习OpenGL,并从中获得乐趣,跟随教程并跟进理论,图形编程本身就是一个小世界。

你似乎是一个真正的OpenGL初学者。我有一本1999年的书"OpenGL超级圣经",它很好地解释了一切(见http://www.starstonesoftware.com/OpenGL/),它对我学习OpenGL有很大帮助。

我可以向你解释glOrthoglTranslatef,但在一天内你将需要解释glRotatef, gluPerspective, glBegin, glClear, glFlush, glVertex3f等等,你不能一直在这里问这些问题。

所以我的建议是去买一本好的OpenGL书(比如OpenGL超级圣经),然后开始从书中学习。

你也可以看看这个,例如在转换部分,但我自己没有读过,所以我不知道它是否足够好。这一部分是关于早期版本的OpenGL,只是对开始了解这个想法有帮助。在现代OpenGL中,你不会这样编程。

一个建议,在现代OpenGL很多常见的做法在OpenGL 1。X已弃用。如果你在google上搜索到NeHe的网站,记住你在那个网站上学到的东西,当你转向更新版本的OpenGL时,你可能会想要忘记。