有人可以清楚地解释这段代码的作用吗?- OpenGL & SDL
Can somebody explain clearly what this code does? - OpenGL & SDL
一般来说,我想找出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有很大帮助。
我可以向你解释glOrtho
和glTranslatef
,但在一天内你将需要解释glRotatef
, gluPerspective
, glBegin
, glClear
, glFlush
, glVertex3f
等等,你不能一直在这里问这些问题。
所以我的建议是去买一本好的OpenGL书(比如OpenGL超级圣经),然后开始从书中学习。
你也可以看看这个,例如在转换部分,但我自己没有读过,所以我不知道它是否足够好。这一部分是关于早期版本的OpenGL,只是对开始了解这个想法有帮助。在现代OpenGL中,你不会这样编程。
一个建议,在现代OpenGL很多常见的做法在OpenGL 1。X已弃用。如果你在google上搜索到NeHe的网站,记住你在那个网站上学到的东西,当你转向更新版本的OpenGL时,你可能会想要忘记。- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 未在作用域中声明unordered_map
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- 循环在计数器中不起作用
- 有没有一种方法可以在编译时获得作用域类名
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- SDL 输入仅在有时起作用
- SDL-使用SDL_TEXTURE的std ::向量不起作用,数组正常工作
- 鼠标在SDL/C 中不起作用
- SDL 2.0 - SDL_GameControllerGetButton不起作用
- C++ + SDL + OpenGL 3.3 在 Mac OS X 上不起作用?
- 有人可以清楚地解释这段代码的作用吗?- OpenGL & SDL