我们需要学习的第二个例子是在第二章的glrect例子。
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT);
// Set current drawing color to red
//
R G
B
glColor3f(1.0f, 0.0f, 0.0f);
// Draw a filled rectangle with current color
glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
// Flush drawing commands
glFlush();
}
///////////////////////////////////////////////////////////
// Setup the rendering state
void SetupRC(void)
{
// Set clear color to blue
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
///////////////////////////////////////////////////////////
// Called by GLUT library when the window has chanaged size
void ChangeSize(int w,
int h)
{
GLfloat aspectRatio;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
printf("w = %d::h = %d",w,h);
// Establish clipping volume (left, right, bottom, top, near, far)
aspectRatio = (GLfloat)w / (GLfloat)h;
if (w <= h)
glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
///////////////////////////////////////////////////////////
// Main program entry point
int main(int argc,
char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE
| GLUT_RGB);
// glutInitWindowSize(800, 600);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
书中对代码解释的非常清楚。这个代码的关键在于当窗口的大小被改变的时候的回调函数ChangeSize的代码。这里h和w分别代表窗口新的高和宽,为了使得我们画的矩形保持正方形,代码如下:
if(w <= h)
glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
这里可以看到opengl中实用的坐标系统是中心点坐标是(0,0)的普通笛卡儿坐标系统,和我们在屏幕上的坐标不同,屏幕上是原点在左上角,x是从左到右依次变大,不会出现负值,Y是从上到下依次变大,不会出现负值,但是opengl其实使用三维坐标系统,是符合右手法则的系统,原点在屏幕中心,X是从左到右变大,但是是从负值变到正值,Y是从下到上变大,从负值变成正值,Z垂直于屏幕,从里到外是从负值到正值的,这和大部分计算机的坐标系统不同。
我们使用函数glOrtho定义X和Y坐标的范围,这里X始终是从-100到正100,所以最后显示的正方形的长度始终是窗口的1/4,在高度上,我们设置为50个高,但是这个表示像素,它需要和glOrtho定义的Y坐标做比较来确定像素。
比如w=h的时候,是正方形,
w = 200;h=400的时候,那么矩形的长是50个像素,这个时候,整个opengl视图在Y上的坐标是-200到200,那么正好矩形的高占了整个视图的1/8,也正好是50个像素。
当w>h的时候,以此类推。
分享到:
相关推荐
opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码
"OpenGL超级宝典"是一本经典的教程书籍,旨在帮助开发者深入理解和掌握OpenGL技术。这本书的示例代码是你学习OpenGL的基础,通过实际操作和运行代码,你可以更好地理解各种图形渲染原理和技巧。 在压缩包中,我们...
openGL超级宝典(第四版)及代码 电子书
《OpenGL超级宝典(第4版)》开篇详细讲解OpenGL图形编程的核心技术,覆盖了从空间中进行绘制到几何变换,从光照到纹理贴图等内容。书中讲解了新的OpenGL功能,包括OpenGL 2.1的强大可编程管线、定点和片段着色和...
opengl 超级宝典 第二版的 源代码
OpenGL超级宝典第五版的源码。没错是源码啊啊啊啊啊啊啊。
综上所述,《OpenGL超级宝典》第六版不仅是一本全面介绍了OpenGL技术的书籍,也是学习和实践OpenGL的理想指南。无论您是刚接触计算机图形学的新手,还是希望深入了解OpenGL高级特性的资深开发者,本书都能够为您提供...
经典OpenGL图形学入门书籍《OpenGL超级宝典英文第五版》及所附完整源码。物有所指!
在“OpenGL超级宝典 笔记21 相关代码”中,我们可能看到以下步骤: 1. **创建缓冲区对象**:首先,使用glGenBuffers生成一个或多个缓冲区对象的ID。 2. **绑定缓冲区**:然后,选择GL_UNIFORM_BUFFER作为目标,并...
“OpenGL超级宝典,英文第五版”是一本非常有价值的资源,对于希望深入学习OpenGL技术的人来说,这本书不仅提供了丰富的理论知识,还包含了大量实践指导,非常适合初学者到高级用户的各个层次的学习需求。...
总之,OpenGL超级宝典第四版的源代码和库文件是学习OpenGL不可或缺的资源,它们为理论学习提供了实践基础,让你能够亲手构建出令人惊叹的图形应用程序。在学习过程中,结合书中的解释和示例代码,一步步深入理解并...
这个资源在超级宝典源码的的基础上添加了一些中文注释,方便理解每一步的目的与作用
《openGL超级宝典(第四版)及代码》(OpenGL SuperBible (4th Edition))
OpenGL超级宝典第五版源代码及开发库是一个珍贵的学习资源,包含了OpenGL编程的详细示例和作者自编的开发库,适用于Linux和Windows操作系统。这个压缩包特别关注了在Windows环境下使用Visual Studio 2013进行配置,...
OpenGL超级宝典第四版(中文版)是一本深入学习OpenGL编程技术的重要参考资料,尤其适合对图形编程感兴趣的初学者和专业人士。OpenGL是一个开放源代码的跨平台图形库,用于在各种操作系统上创建2D和3D图像。随着技术...
《openGL超级宝典(第四版)及代码》 Comprehensive Tutorial and Reference Richard S. Wright, Jr. Benjamin Lipchak Nicholas Haemel
本资源是以压缩包的形式的, 里面是一个 “TXT”的文档, 文档中 有“百度云” 分享的链接, 这本书太大,...原作名: OpenGL SuperBible: Comprehensive Tutorial and Reference (5th Edition) 译者: 付飞 / 李艳辉
OpenGL超级宝典第二版源码是一份非常宝贵的资源,对于想要深入学习和理解OpenGL图形编程的开发者来说,它是不可或缺的学习资料。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D图像,广泛应用于游戏开发、...
OpenGL超级宝典的随书光盘,里面所有例子的代码