代码从此处下载

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出来。

更多细节参考  http://wenku.baidu.com/view/a4f5748fcc22bcd126ff0c1a.html

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(, , , );
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

opengl (1) 基本API的熟悉的更多相关文章

  1. OpenGL FrameBufferCopy相关Api比较(glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D)

    OpenGL FrameBufferCopy相关Api比较 glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D 标题所述 ...

  2. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  3. guava 学习笔记 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  4. 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  5. 【转】瓜娃(guava)的API快速熟悉使用

    http://www.cnblogs.com/snidget/archive/2013/02/05/2893344.html 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: I ...

  6. Android 中建立一个OpenGL ES的开发环境

    转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...

  7. Vulkan在Android使用Compute shader

    oeip 相关功能只能运行在window平台,想移植到android平台,暂时选择vulkan做为图像处理,主要一是里面有单独的计算管线且支持好,二是熟悉下最新的渲染技术思路. 这个 demo(git ...

  8. OpenGL ES: (4) EGL API详解 (转)

    上一节我们初步学习了 OpenGL ES.EGL.GLSL 的相关概念,了解了它们的功能,以及它们之间的关联.我们知道了 EGL 是绘制 API(比如 OpenGL ES)与 底层平台窗口系统之间的接 ...

  9. OpenGL 开始学习指南

    近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenG ...

随机推荐

  1. hdu 2191 珍惜现在,感恩生活 多重背包入门题

    背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...

  2. Android全部权限详解(manifest.xml)

    当我们在写android程序时有很多功能都要在androidmanifest.xml中加入权限申明才能正常使用,下面就把所有的权限介绍一下: android.permission.ACCESS_CHE ...

  3. PHP完整环境搭建

    Linux(CentOS 7)+ Nginx(1.10.2)+ Mysql(5.7.16)+ PHP(7.0.12) 首先安装Linux系统,我以虚拟机安装来做示例,先去下载 VitualBox,这是 ...

  4. MySQL 5.7 启用查询日志

    MySQL版本:5.7 新版本的 my.ini 文件改动了,导致原先启用查询日志的方法不再适用 新版本的启用方法如下: 1. 修改 C:\ProgramData\MySQL\MySQL Server ...

  5. iOS序列化与反序列化

    1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...

  6. JAVA自学之-----FileInputStream类

    1, FileInputStream类函数创建: package coreJava; import java.io.FileInputStream; import java.io.IOExceptio ...

  7. [状压dp]HDU5045 Contest

    题意: n和人做m道题, 每俩人做的题数不能相差一题以上.(也就是每n道题分别由n个人完成)   给n个人分别做m道题的概率, 求完成m题的最大期望 $1\le N \le 10$ 注意!!! fil ...

  8. C++的表驱动法

    目的:使用表驱动法,替换复杂的if/else和switch/case语句. 说明:JS 等其他语言也都支持的. 表驱动发示例:http://blog.csdn.net/zhouyulu/article ...

  9. SQLite入门与分析(八)---存储模型(1)

    写在前面:SQLite作为嵌入式数据库,通常针对的应用的数据量相对于通常DBMS的数据量是较小的.所以它的存储模型设计得非常简单,总的来说,SQLite把一个数据文件分成若干大小相等的页面,然后以B树 ...

  10. 【Linux远程管理】SSH协议远程管理

    SSH(Secure Shell)协议.命令行界面(CLI)下的远程管理工具,几乎所有的操作系统都有,区别于Telnet,SSH在进行数据传送时会对数据进行加密,所以SSH是比较安全的协议.几乎所有的 ...