OpenGL编程指南 - 第二章
来源:互联网 发布:sql insert into date 编辑:程序博客网 时间:2024/04/29 16:24
OpenGL是根据三维投影几何的齐次坐标进行操作的。因此,在内部的计算中,所有的顶点都是用4个浮点坐标值表示的(x, y, z和w)。如果w不等于0,那么这些坐标值就对应于欧几里德三维点(x/w, y/w, z/w)。虽然可以在OpenGL函数中指定w坐标,但是这种做法极为罕见。
在OpenGL中,所有的几何物体最终都描述成一组有序的顶点。glVertex*()函数用于指定顶点。
1. void glVertex[234]{sifd}(TYPE coords);
2. void glVertex[234]{sifd}v(const TYPE* coords);
指定了一个用于描述几何物体的顶点。可以选择这个函数的适当版本,既可以为一个顶点提供多达4个的坐标(x, y, z, w),也可以只提供2个坐标(x, y)。如果选择的函数版本并没有显式地指定z或w,z就会当作0,w则默认为1。glVertext*()函数只有当它位于glBegin()和glEnd()之间时才有效。 除非被编译到一个显示列表中,否则,所有的glVertex*()函数都应该出现在glBegin()和glEnd()之间。
void glBegin(GLenum mode);几何图元类型和说明
类型说明GL_POINTS单个顶点集GL_LINES多组双顶点线段GL_POLYGON单个简单填充凸多边形GL_TRAINGLES 多组独立填充三角形GL_QUADS多组独立填充四边形GL_LINE_STRIP不闭合折线GL_LINE_LOOP闭合折线GL_TRAINGLE_STRIP线型连续填充三角形串GL_TRAINGLE_FAN扇形连续填充三角形串GL_QUAD_STRIP连续填充四边形串
在glBegin()和glEnd()之间可调用的函数
// OpenGLDemo.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <GL/glut.h>#include <math.h>const int n = 1000;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;const GLfloat factor = 0.1f;void myDisplay(void){ ///第一个程序----矩形 //glClear(GL_COLOR_BUFFER_BIT); //glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //glFlush(); ///第二个程序----圆 //int i; //glClear(GL_COLOR_BUFFER_BIT); //glBegin(GL_POLYGON);//有顶点就必须要有glBegin() glEnd(); //for(i=0; i<n; ++i) // glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); //glEnd(); //glFlush(); ///第三个程序---五星 GLfloat a = 1 / (2-2*cos(72*Pi/180)); GLfloat bx = a * cos(18 * Pi/180); GLfloat by = a * sin(18 * Pi/180); GLfloat cy = -a * cos(18 * Pi/180); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); // 按照A->C->E->B->D->A的顺序,将五角星画出 glBegin(GL_LINE_LOOP);//闭合折线 glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush(); ///第四个程序----画出正弦函数图形 //GLfloat x; //glClear(GL_COLOR_BUFFER_BIT); //glBegin(GL_LINES); //glVertex2f(-1.0f, 0.0f); //glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 //glVertex2f(0.0f, -1.0f); //glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 //glEnd(); //glBegin(GL_LINE_STRIP); //for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f) //{ // glVertex2f(x*factor, sin(x)*factor); //} //glEnd(); //glFlush();}int main(int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("第一个OpenGL程序"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0;}
为了打开或关闭这些状态,可以使用下面这两个简单的函数:
1. void glEnable(GLenum capability);
2. void glDisable(GLenum capability);
glEnable()启用一个功能,glDisable()用于关闭一个功能。程序员可以向glEnable()或glDisable()传递超过6 0 个的枚举值作为参数.
3. GLboolean glIsEnabled(GLenum capability) ;
根据被查询的状态当前处于启用还是禁用状态,它返回GL_TRUE或GL_FALSE。
可以使用的查询函数共有5个,可以查询许多状态的当前值:
1. void glGetBooleanv(GLenum pname, GLboolean *params);
2. void glGetIntegerv(GLenum pname, GLint *params);
3. void glGetFloatv(GLenum pname, GLfloat *params);
4. void glGetDoublev(GLenum pname, GLdouble *params);
5. void glGetPointerv(GLenum pname, GLvoid **params);
点的细节
glPointSize()函数,并在参数中提供一个值,表示所需要的点的大小(以像素为单位)。
1. void glPointSize(GLfloat size);
设置被渲染点的宽度,以像素为单位。size必须大于0.0,在默认情况下为1.0。
抗锯齿功能被禁用(默认情况)
在屏幕上所绘制的是对齐的正方形像素区域。因此,如果宽度值是1.0,这个方块的大小就是1个像素乘以1个像素;如果宽度为2.0,这个方块就是2个像素乘以2个像素.
启用了抗锯齿或多重采样
屏幕上所绘制的将是一个圆形的像素区域。一般情况下,位于边界的像素所使用的颜色强度较小,使边缘具有更平滑的外观。
glGetFloatv()函数查询点的信息:
GL_ALIASED_POINT_RANGE 未进行抗锯齿处理的情况下最小和最大的点。
GL_SMOOTH_POINT_SIZE_RANGE 进行了抗锯齿处理的情况下最小和最大的点。O p e n G L支持的非抗锯齿点的大小均匀地分布在最小和最大范围之间。
GL_SMOOTH_POINT_SIZE_GRANULARITY 支持的特定抗锯齿点大小的精度。例如,如果调用glPointSize(2.37),并且返回的粒度值为0.1,那么这个点的大小将四舍五入为2.4。
- OpenGL编程指南 - 第二章
- Opengl编程指南第二章:状态管理、几何绘图
- Opengl编程指南第二章:状态管理、几何绘图
- opengl编程指南笔记(三)第二章 状态管理和绘制几何物体
- OpenGL编程指南之阅读笔记 第二章 状态管理和绘制几何物体
- Opengl编程指南第三章:视图
- OpenGL编程指南第四章:颜色
- OpenGL编程指南第五章:光照
- OpenGL编程指南第七章:显示列表
- OpenGL编程指南第九章:纹理映射
- OpenGL编程指南第十章:Frame buffer
- OpenGL编程指南第四章:颜色
- OpenGL编程指南第五章:光照
- OpenGL编程指南第九章:纹理映射
- OpenGL编程指南第十章:Frame buffer
- 《OpenGL编程基础》第二章笔记1
- 《OpenGL编程基础》第二章笔记2
- 《OpenGL编程基础》第二章习题1
- 按键适配
- foreach循环详解
- android取得手机屏幕大小DisplayMetrics的核心代码
- 62 架构师首先是开发人员
- 2012C++程序设计实验报告【9.4】
- OpenGL编程指南 - 第二章
- 九周任务三:定义分数类中的<<和>>的重载,实现分数的输入和输出
- C语言中的多维数组与指针
- lhgdialog API 说明(1)
- 如何减小与“大牛”的差距
- socket
- CEdit
- JavaScript开发工具:Closure Tools
- AS3 AsDoc 介绍、使用