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。

 

 

 

原创粉丝点击