博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opengl (1) 基本API的熟悉
阅读量:5885 次
发布时间:2019-06-19

本文共 2140 字,大约阅读时间需要 7 分钟。

1 运行如下代码,可以看到如下效果,我们利用opengl画出一个三角形。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void renderScene(void){    /*    glClear清除缓冲区    */    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    /*    将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作    1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。    2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。    3.中心左面的坐标值是负值,右面是正值。    移向屏幕顶端是正值,移向屏幕底端是负值。    移入屏幕深处是负值,移出屏幕则是正值。    */    glLoadIdentity();    /*    画出三个顶点,根据这三个顶点链接成一个凸包    */    glBegin(GL_TRIANGLES);//GL_TRIANGLES三角形    glVertex3f(-1.0, -1.0, 0.0);    glVertex3f(1.0, 0.0, 0.0);    glVertex3f(0.0, 1.0, 0.0);    glEnd();    /*    双缓冲模式    与 glutInitDisplayMode(GLUT_RGBA) 对应    */    glutSwapBuffers();}

这个代码中需要解释的是glLoadIdentity(),假如这个函数去掉,当我们窗口大小变化的时候,窗口中的所有东西都会消失。

这个小小的细节涉及到opengl的渲染机制,opengl有个变化矩阵堆栈,opengl中的每个定义好的将要渲染的矩阵呈现之前都要先乘以栈顶的矩阵。glLoadIdentity()将栈顶的矩阵设置为固定不变的单位矩阵,所以当窗口大小变化需要重绘窗口的时候,就可以就可以保持不变了。

其他情况类似的情况如下:

glTranslatef:将T(x,y,z)右乘与堆栈的栈顶变换矩阵。右乘的解释,假设目前栈顶变换矩阵为M,那么就相当于把M修改为M*T.

glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。
glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。
glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后Push到堆栈中。所谓Push,就像塞子弹一样把一个矩阵压入到堆栈中,此时,栈顶就是这个新的矩阵了,注意定义的向量都是和栈顶变换矩阵作用的。

glPopMatrix:将堆栈的栈顶变换矩阵Pop出来。

更多细节参考  

 

2 关于视图显示 glViewport();glOrtho();

void renderScene_1(void){    glClearColor(0.0, 0.0, 0.0, 0.0);    glClear(GL_COLOR_BUFFER_BIT);    /*     画笔的颜色    */    glColor3f(1.0, 1.0, 0.0);        glLoadIdentity();        /*     http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f     http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html     glOrtho获取截屏    procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);    拉伸之后放在glViewPort上,    根据glViewPort(x, y, width, height)    放在总的窗口上的(x, y)坐标上    */    glViewport(50, 50, 300, 300);    glOrtho(0.25, 0.25, 0.75, 0.75, -0.0, 0.5);    /*     画一个正方形    */    glBegin(GL_POLYGON);    {        glVertex3f(0.25, 0.25, 0.0);        glVertex3f(0.75, 0.25, 0.0);        glVertex3f(0.75, 0.75, 0.0);        glVertex3f(0.25, 0.75, 0.0);    }    glEnd();    /*     双缓冲渲染    */    glutSwapBuffers();}

 

http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f

http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html

转载于:https://www.cnblogs.com/zhxfl/p/3320246.html

你可能感兴趣的文章
GoogLeNet学习心得
查看>>
C#终于支持可选参数了!
查看>>
git常用命令总结
查看>>
使用Topshelf创建Windows 服务
查看>>
Intellij IDEA 安装 Mybatis插件
查看>>
Windows Service 之 Bug 记录
查看>>
expect实现无交互操作
查看>>
出现二个奇葩bug
查看>>
【GMT43智能液晶模块】例程七:定时器PWM实验——简易电子琴
查看>>
CentOS7 yum安装、配置PostgreSQL 9.5
查看>>
js cookie介绍和实例(用于自动登录,记住用户名等)
查看>>
CSS魔法堂:display:none与visibility:hidden的恩怨情仇
查看>>
git 放弃本地修改(转)
查看>>
.NET获取服务器信息,如服务器版本、IIS等
查看>>
你能熟练使用Dictionary字典和List列表吗?
查看>>
读取Json
查看>>
关于DLL文件和EXE文件不在同一目录下的设置
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 密码强化、网络安全强化...
查看>>
web 开发之js---ajax 中的两种返回状态 xmlhttp.status和 xmlhttp.readyState
查看>>
TeX
查看>>