参考《opengl入门教程》、《OpenGL之坐标转换》、《OpenGL绘制管线操作细节》等资料。

复习下留个备忘:)

/*-
* Opengl Demo Test
*
* Fredric : 2016-7-8
*/
#include <GLUT/GLUT.h> void display_demo01(); void display_demo02(); void display_demo03(); void display_demo04(); /*
* Main Function
*/
int main(int argc, char ** argv)
{
/* glutInit
* GLUT初始化
*/
glutInit(&argc, argv); /*
* int glutCreateWindow(char* name);
* 产生一个顶层窗口
* char* name:窗口名称
* return int:窗口标记符号,可以glutGetWindow获取引用
*/
glutCreateWindow("Fredric Practice Demo"); /*
* void glutDisplayFunc(void (*func)(void));
* 为当前窗口设置显示回调函数
*/
glutDisplayFunc(display_demo04); /*
* void glutMainLoop()
* glut程序进入事件循环
*/
glutMainLoop(); } //**************************************************************************** /*
* 基础显示函数demo
*/
void display_demo01(){ /*
* void glClear(GLbitfield mask);
* 根据mask的要求清除缓冲值
* GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲
* GL_DEPTH_BUFFER_BIT: 深度缓冲
* GL_ACCUM_BUFFER_BIT: 累积缓冲
* GL_STENCIL_BUFFER_BIT: 模板缓冲
*/
glClear(GL_COLOR_BUFFER_BIT); /*
* void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
* 等价于:
* glBegin(GL_POLYGON);
* glVertex2(x1, y1);
* glVertex2(x2, y1);
* glVertex2(x2, y2);
* glVertex2(x1, y2);
* glEnd();
* 在opengl的世界坐标系中,(0,0,0)是屏幕中心的原点,整个窗口范围为-1到1
* 在下例中绘制的矩形覆盖全部窗口
*/
glRectf(-1.0f, -1.0f, 1.0f, 1.0f); /*
* opengl命令立即执行
*/
glFlush();
} //**************************************************************************** /*
* 绘制基本图形demo
*/
void display_demo02(){ //绘制点
glClear(GL_COLOR_BUFFER_BIT); /*
* 限定一组或多组图元的定义
*/
glBegin(GL_POINTS);
/*
* void glPointSize( GLfloat size);
* 定义栅格点的大小,初始大小为1
*/
glPointSize(5.0f);
glVertex2f(-0.5f, 0.0f);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush(); //绘制直线
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES); //下例中会绘制两条直线
glVertex2f(-0.5f, 0.0f);
glVertex2f(0.5f, 0.0f); glVertex2f(-0.5f, -0.3f);
glVertex2f(0.5f, 0.3f);
glEnd();
glFlush(); //绘制多边形
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5f, 0.0f);
glVertex2f(0.5f, 0.0f);
glVertex2f(-0.5f, -0.3f);
glVertex2f(0.5f, 0.3f);
glEnd();
glFlush(); //绘制圆
int n = ;
float pi = 3.1415926;
float d = 0.5f; glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON); for(int i = ; i < n; i++){
glVertex2f(d*cos(*pi/n*i), d*sin(*pi/n*i));
} glEnd();
glFlush(); } //********************************************************************************* /*
* 颜色基本处理demo
*/
void display_demo03(){ float pi = 3.1415926; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_FAN); /*
* void glColor3f (GLfloat red, GLfloat green, GLfloat blue);
* R\G\B 三原色值
*/
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
for(int i=; i<=; ++i) {
glColor3f(i * 0x04, , );
glVertex2f(cos(i*pi/), sin(i*pi/));
}
glEnd();
glFlush();
} //*********************************************************************************** /*
* 绘制立体基本形状demo
* 在opengl的绘制管线中,主要分为两部分工作:
* 1、模型观测变化:即具体物体的现实位置和角度
* 2、投影变换:即将3维信息的图像影射到2维的屏幕中
* 此过程中,涉及6个坐标:
* 1、属于模型观测变换:
* 1.1、MC(Model Coordinate) -> 模型坐标,即物体对象自己的坐标,如我们说一个正方形的定点1,1,是相对自己的某个原点0,0;
* 1.2、WC(Word Coordinate) -> 世界坐标,将N多物体的模型坐标,统一到一个公共的坐标系;
* 1.3、VC(View Coordinate) -> 观测坐标,理解为观察的角度,即相机摆放的位置和角度
* 2、属于投影变换:
* 2.1、PC(Project Coordinate) -> 将上述模型变换后的3维信息映射到2维平面上,分为正交、斜投影、透射投影等,其中透射投影包涵近小远大的概念;
* 2.2、NC(Normalization Coordinate) -> 将投影变换的结果归一化到一个单位为1的空间内
* 3、视口变换:
* 3.1 DC(Device Coordinate) -> 实际在设备即屏幕上显示的坐标
*/
void display_demo04(){ /*
* opengl功能启用,例如:
* GL_DEPTH_TEST:启用深度测试,根据坐标远近实现遮挡
* GL_ALPHA_TEST:根据其透明程度看是否被遮挡
* GL_AUTO_NORMAL:能够进行光线反射
* GL_TEXTURE_2D:启用二维纹理
*/
glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /*
* void glMatrixMode (GLenum mode);
* GL_PROJECTION: 对投影视图进行操作
* GL_MODELVIEW: 对模型视图进行操作
* GL_TEXTURE: 对纹理进行操作
*/
glMatrixMode(GL_PROJECTION); //把当前矩阵设置为单位矩阵
glLoadIdentity(); /*
* void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
* fovy:视角
* aspect:宽高比
* zNear:近点距离
* zFar:远点距离
*/
gluPerspective(, , , ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /*
* gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ)
* eyeX/Y/Z:相机在世界坐标中的位置
* centerX/Y/Z:物体在世界坐标中的位置
* upX/Y/Z: 相机的方向(相对世界坐标系)
*/
gluLookAt(, -, , , , , , , ); glColor3f(1.0f, 0.5f, 0.0f); /*
* glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
* angle:旋转的方向
* x/y/z: 旋转的方向向量
*/
glRotatef(-80.0f,10.0f,5.0f,0.0f); /*
* void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
* radius:半径
* slices:经线数量
* stacks:纬线数量
*/
glutWireCube(); glFlush(); }

opengl 笔记(1)的更多相关文章

  1. opengl笔记——旋转,一段代码的理解

    重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix g ...

  2. OpenGL 笔记 <2> Compiling and Linking a shader program

    Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ...

  3. opengl 笔记(2)

    /*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h ...

  4. opengl笔记—— glMultMatrixf() 区别 glLoadMatrixf()

    能找到最好的解释来自:http://www.gamedev.net/topic/489879-glpushmatrixglpopmatrix--glloadmatrixf/ 原理: glPushMat ...

  5. opengl笔记

    GL_ARRAY_BUFFER(表示顶点数据) GL_ELEMENT_ARRAY_BUFFER(表示索引数据) GL_PIXEL_UNPACK_BUFEER( 表示传递给O p e n G L 的像素 ...

  6. OpenGL笔记(五) 着色器渲染(以Android为例)

    一.Android平台上下文环境的创建及初始化 1. 首先实例化Android上下文环境,即EGL的初始化. bool EGLCore::init(EGLContext sharedContext) ...

  7. OpenGL笔记(四) API参考

    常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...

  8. OpenGL笔记(三) GLSL语法与内建函数

    GLSL,OpenGL Shading Language,GLSL中没有指针,并且没有任何类型的字符串或字符. (1)GLSL的修饰符与基本数据类型 const:用于声明非可写的编译时常量变量: at ...

  9. OpenGL笔记(一) 绘制三角形

    GLTools: 一些有用且可复用的函数 GLEW: OpenGL API的一些扩展机制 GLUT: OpenGL Utility toolkit, OpenGL跨平台相关,隐藏平台相关细节 RC代表 ...

随机推荐

  1. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  2. jsp前端实现分页代码

    前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...

  3. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  4. 我为NET狂官方面试题-数据库篇

    求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...

  5. JQuery 选择器

    选择器是JQuery的根基,在JQuery中,对事件的处理,遍历DOM和AJAX操作都依赖于选择器.如果能够熟练地使用选择器,不仅能简化代码,而且还可以事半功倍. JQuery选择器的优势 1.简洁的 ...

  6. P2V之后的磁盘扩容新思路

    背景: 原先的物理机环境多是若干块物理磁盘经过RAID卡进行了RAID5之后的虚拟磁盘组,这样我们在操作系统内看到的也就是一块完整的磁盘.我们会在上面进行分区,然后格式化后以便使用. Figure 1 ...

  7. PHP代码优化

    1 代码优化 1 尽量静态化 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和 ...

  8. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  9. Register-SPWorkflowService 404

    最近需要做一个SharePoint 2013工作流演示环境. 于是在自己的本子上安装了一个虚拟机. 虚拟机操作系统是Windows Server 2012 R2,计划把AD.SQL Server 20 ...

  10. 【centos7常用技巧】RPM打包

    一.RPM打包的目的 1.当目标机中不存在编译环境时,可以先在本地环境中编译打包,然后直接在目标机中用rpm -ivh *.rpm安装即可. 2.当需要在目标机中安装多个软件或者增加多个文件时,可以将 ...