您的位置:首页 > 运维架构

opengl 笔记(1)

2016-07-10 09:31 260 查看
参考《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 = 40;
float pi = 3.1415926;
float d  = 0.5f;

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);

for(int i = 0; i < n; i++){
glVertex2f(d*cos(2*pi/n*i), d*sin(2*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=0; i<=8; ++i) {
glColor3f(i * 0x04, 0, 0);
glVertex2f(cos(i*pi/4), sin(i*pi/4));
}
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(75, 1, 1, 1000);

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(0, -100, 200, 0, 50, 10, 0, 0, 1);

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

glFlush();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: