OpenGL编程指南 - 第二章

        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。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 第1章OpenGL简介 1.1什么是OpenGL? 1.2一段简单的OpenGL代码 1.3OpenGL函数的语法 1.4OpenGL是个状态机 1.5OpenGL渲染管线 1.5.1显示列表 1.5.2求值器 1.5.3基于顶点的操作 1.5.4图元装配 1.5.5像素操作 1.5.6纹理装配 1.5.7光栅化 1.5.8片断操作 1.6与OpenGL相关的函数库 1.6.1包含文件 1.6.2GLUT,OpenGL实用工具包 1.7动画 1.7.1暂停刷新 1.7.2动画=重绘+交换 第2章状态管理和绘制几何物体 2.1绘图工具箱 2.1.1清除窗口 2.1.2指定颜色 2.1.3强制完成绘图操作 2.1.4坐标系统工具箱 2.2描述点、直线和多边形 2.2.1什么是点、直线和多边形? 2.2.2指定顶点 2.2.3OpenGL几何图元 2.3基本状态管理 2.4显示点、直线和多边形 2.4.1点的细节 2.4.2直线的细节 2.4.3多边形的细节 2.5法线向量 2.6顶点数组 2.6.1步骤1:启用数组 2.6.2步骤2:指定数组的数据 2.6.3步骤3:解引用和渲染 2.7缓冲区对象 2.7.1创建缓冲区对象 2.7.2激活缓冲区对象 2.7.3用数据分配和初始化缓冲区对象 2.7.4更新缓冲区对象的数据值 2.7.5清除缓冲区对象 2.7.6使用缓冲区对象存储顶点数据数据 2.8属性组 2.9关于创建多边形表面模型的一些提示 2.9.1例子:创建一个二十面体 第3章视图 3.1简介:照相机比喻 3.2.1一个简单的例子:绘制立方体 3.1.2通用的变换函数 3.2视图和模型变换 3.2.1对变换进行思考 3.2.2模型变换 3.2.3视图变换 3.3投影变换 3.3.1透视投影 …… 第4章颜色 第5章光照 第6章混合、抗锯齿、雾和多边形偏移 第7章显示列表 第8章绘制像素、位图、字体和图像 第9章纹理贴图 第10章帧缓冲区 第11章分格化和二次方程表面 第12章求值器和NURBS 第13章选择和反馈 第14章OpenGL高级技巧 第15章OpenGL着色语言 附录A操作顺序 附录B状态变量 附录COpenGL和窗口系统 附录DGLUT(OpenGL实用工具库)基础知识 附录E计算法线向量 附录F齐次坐标和变换矩阵 附录G编程提示 附录HOpenGL的不变性规则 附录IOpenGL着色语言内置的变量和函数 术语表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值