实验3、OpenGL基本图元绘制
系别:计算机学院 专业班级:10信科2班
姓名: 学号:
实验日期:2013-5-10 实验
日期:2013-5-10
一、 实验目的
1熟悉VC6.0开发平台;
2熟悉OpenGL开发库;
二、 实验内容:
1. 在同一个窗口内绘制以下图元:
? 用不同颜色绘制大小从1到5的5个点;
? 用不同颜色绘制宽度为1、3、5的三条直线段;
? 绘制一条包含5个顶点的折线段;
? 绘制一个三角形,三个顶点颜色各不相同,三角形内部用平滑方式进行填充;
? 绘制一个六边形;
2. ,不使用反混淆绘制宽度为5的直线;启用反混淆后在不同位置绘制相同的直线,比较两者异同。
三、 一个OpenGL实例
1.程序中有关画图的代码:
void DrawGLScene(GLvoid) // 此函数完成图形绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓冲区和深度缓冲区
glLoadIdentity(); // 重置当前模型视图矩阵
glTranslatef(-1.5f,0.0f,0.0f); // 向左平移50个单位
glBegin(GL_TRIANGLES); // 绘制三角形
glColor3f(1.0f,0.0f,0.0f); //画笔设置为红色
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f); // 设置为绿色
glVertex3f(-1.0f,-1.0f, 0.0f); glColor3f(0.0f,0.0f,1.0f); //设置为蓝色
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd(); // 完成三角形的绘制
glTranslatef(3.0f,0.0f,0.0f); // 向右平移3个单位
glColor3f(0.0f,1.0f,1.0f); // 设为青色
glBegin(GL_QUADS); // 画四边形
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f); /
glEnd(); //完成四边形绘制
glFlush();
}
四、 实验报告内容
1程序源码;
2对主要画图函数的说明(函数的功能,参数等)。
// 图形.cpp : Defines the entry point for the console application.
//
#include
#include
#include
#include
#define MAX 10^6;
//如果需要记录鼠标点的位置,就定义全局变量来保存
struct Point {int x, y;};
Point pt[2];
int pointNum=0;//标记点号,0表示线段起点,1表示线段中点
void MyDrawGLScene() // 此函数完成图形绘制
{
int i;
float pSizes[5]={1.0f,2.0f,3.0f,4.0f,5.0f}; //设定五个点的大小
float lWidth[5]={1.0f,2.0f,3.0f,4.0f,5.0f}; //设定五条直线的宽度
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓冲区和深度缓冲区
glLoadIdentity(); // 重置当前模型视图矩阵
glTranslatef(-1.8f,-0.1f,0.0f); // 向左平移50个单位
// 绘制五个大小不同的的点
glEnable(GL_POINT_SMOOTH); //开启反混淆
for( i=0;i<5;i++){// 绘制五个大小不同的的点
glPointSize(pSizes[i]);
glTranslatef(0.1f,-0.0f,0.0f); // 向右平移50个单位
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f); //画笔设置为红色
glVertex2f(1.0f,1.0f);
glEnd();
}
//绘制五条不同宽度的直线
glTranslatef(-0.5f,-0.1f,0.0f); // 向左平移50个单位
for(i=0;i<5;i++) //绘制五条不同宽度的直线
{
glTranslatef(0.0f,-0.1f,0.0f);
glLineWidth(lWidth[i]); //设定直线的宽度
glBegin(GL_LINES);
glColor3f(0.0f,1.0f,0.0f); //画笔设置为绿色
glVertex2f(1.0f,1.0f);
glVertex2f(2.0f,1.0f);
glEnd();
}
//画五个定点的折线
glTranslatef(0.0f,-0.2f,0.0f); // 向左平移50个单位
glColor3f(0.0f,0.0f,1.0f); //画笔设置为蓝色
glLineWidth(3.0f); //设定直线的宽度
glBegin(GL_LINE_STRIP); //画五个定点的折线
glVertex2f(1.0f,1.0f);
glVertex2f(1.2f,1.1f);
glVertex2f(1.4f,1.0f);
glVertex2f(1.6f,1.1f);
glVertex2f(1.8f,1.0f);
glEnd();
// 绘制三角形
glTranslatef(1.5f,0.7f,0.0f); // 向左平移50个单位
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //选择三角形的光栅化模式为多边形内部被填充,选用参数GL_FILL
glEnable(GL_POLYGON_STIPPLE); //平滑填充三角形
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f); //画笔设置为红色
glVertex3f( 0.0f, 0.15f, 0.0f);
glColor3f(0.0f,0.5f,0.0f); // 设置为绿色
glVertex3f(-0.15f,-0.15f, 0.0f);
glColor3f(0.0f,0.0f,1.0f); //设置为蓝色
glVertex3f(0.15f,-0.15f, 0.0f);
glEnd(); // 完成三角形的绘制
// 画正六形
glTranslatef(0.5f,0.0f,0.0f); // 向右平移0.5个单位
glColor3f(0.0f,1.0f,1.0f); // 设为青色
glBegin(GL_POLYGON);
glVertex3f(-0.2f, 0.0f, 0.0f);
glVertex3f(-0.1f, 0.1732f, 0.0f);
glVertex3f( 0.1f,0.1732f, 0.0f);
glVertex3f(0.2f,0.0f, 0.0f);
glVertex3f(0.1f,-0.1732f, 0.0f);
glVertex3f(-0.1f,-0.1732f, 0.0f);
glEnd(); //完成正六边形形绘制
//使用反混淆绘制宽度为5的直线
glTranslatef(-0.4f,-0.3f,0.0f); // 向下平移0.3个单位
glLineWidth(5.0f); //设定直线的宽度为5
glColor3f(0.3f,0.5f,0.9f); //画笔设置为紫色
glEnable(GL_LINE_SMOOTH);
glBegin(GL_LINES); //使用反混淆绘制宽度为5的直线
glVertex3f(-0.5f, -0.1f, 0.0f);
glVertex3f(0.5f, 0.1f, 0.0f);
glEnd();
//不适用反混淆方式绘制宽度为5的直线
glDisable(GL_LINE_SMOOTH); //关闭反混淆
glBegin(GL_LINES); //不适用反混淆方式绘制宽度为5的直线
glVertex3f(-0.1f, -0.1f, 0.0f);
glVertex3f(0.9f, 0.1f, 0.0f);
glEnd();
glFlush();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);//画图之前先设置画图区的背景色
glColor3f (1.0f, 0.0f, 0.0f);//设置前景色(相当于画笔颜色)
LARGE_INTEGER Freq;
LARGE_INTEGER start;
LARGE_INTEGER end;
QueryPerformanceFrequency(&Freq); // 获取时钟周期
if(pointNum == 2)
{
QueryPerformanceCounter(&start); // 获取时钟计数
MyDrawGLScene();
QueryPerformanceCounter(&end);
继续阅读