一般来说,我想找出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教程,但它没有描述很多代码。
非常感谢任何可以提供帮助的人。
答案 0 :(得分:7)
我会为你分解:
bool init_GL()
{
这个函数,我的意思是init_GL,是不好的风格。它所做的一切,实际上都属于绘图功能
glClearColor( 0, 0, 0, 0 );
glClearColor设置在使用GL_COLOR_BUFFER_BIT设置调用glClear时帧缓冲区将填充(清除)的颜色。
//Set projection
glMatrixMode( GL_PROJECTION );
glMatrixMode切换OpenGL矩阵操作函数生效的矩阵。 OpenGL知道矩阵“投影”,“模型视图”,“纹理”和“颜色”。最后两个很少被触及。
glLoadIdentity();
Load Identity将在矩阵堆栈中的当前位置放置一个单位矩阵。单位矩阵乘以向量,将产生相同的向量。
glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );
glOrtho将单位矩阵与orthographic projection矩阵相乘。一些投影,如正交或仿射透视可以通过线性变换来描述。线性变换可以用矩阵表示。在某种程度上,你可能会认为投影矩阵是OpenGL相机的“镜头”(虽然OpenGL中没有相机!)。
//Initialize modelview matrix
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
这里矩阵模式切换到Modelview矩阵。 Modelview矩阵用于在世界中放置对象(模型)并相对于“相机”移动世界(-view,因此是模型视图)。
//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;
}
到目前为止,没有任何内容呈现。此程序也没有事件循环,因此窗口只会在屏幕上闪烁,消失并且程序终止。
答案 1 :(得分:1)
基本上你可以说glOrtho和glTranslate都会产生与当前渲染矩阵相乘的矩阵。最终渲染矩阵将用于变换场景中的所有顶点,这将影响光照,剔除,透视。因此,最后,所有这些矩阵都控制着对象渲染到屏幕的方式。
使用这些(与许多其他矩阵函数一起使用),您可以缩放,旋转,平移场景中的对象,并控制是否应使用正交(平行)投影或透视投影。你可以在这里阅读这些内容:
glOrtho描述了一种产生平行投影的变换。 当前矩阵(参见glMatrixMode)乘以该矩阵 并且结果替换当前矩阵
glTranslate通过(x,y,z)生成翻译。 目前的矩阵 (看到 glMatrixMode) 乘以此平移矩阵
但我认为,如果你真的想学习OpenGL,并且乐在其中,请按照教程和理论进行跟进,图形编程本身就是一个世界。
答案 2 :(得分:0)
你似乎是OpenGL的真正初学者。我有1999年出版的“OpenGL超级圣经”一书,它很好地解释了一切(见http://www.starstonesoftware.com/OpenGL/),它帮助我学习了很多OpenGL。
我可以向您解释glOrtho
和glTranslatef
,但有一天您需要对glRotatef
,gluPerspective
,glBegin
进行解释, glClear
,glFlush
,glVertex3f
等等,你不能在这里问这些问题。
所以我的建议是去购买一本不错的OpenGL书(比如OpenGL超级圣经)并开始学习它。
您还可以查看this,例如转换部分,但我自己没有看过,所以我不知道它是否足够好。这部分是关于OpenGL的早期版本,并且只对开始获得想法有好处。在现代的OpenGL中,你不会那样编程。
一句忠告,在现代OpenGL中,不推荐使用OpenGL 1.x中的许多常见做法。如果您搜索谷歌并最终进入NeHe的网站,请记住您在该网站上学到的内容,您可能想要忘记何时转到更新版本的OpenGL。