20170217. OpenGL3 (绘制几何图形)


// opengltest.cpp : 定义控制台应用程序的入口点。
// NOTES:
// 1. 必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。为了禁用直线点画功能,可以向glDisable()函数传递同一个参数
// 2. OPENGL中规定:如果多边形的顶点以逆时针顺序出现在屏幕上,则为“正面”
// 3. 在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。
// 4. 直线可以被画成虚线,而多边形则可以进行镂空。关于镂空,参考以下网址
// http://blog.csdn.net/dcrmg/article/details/53070689




#include "stdafx.h"
#include <GL/glut.h> 
#include <iostream>

// 控制线的粗细
//void myDisplay(void)
//{
//     glClear(GL_COLOR_BUFFER_BIT);
//
//     //glPointSize(10.0f);// 设置点大小
//	 GLfloat width = 10.0; 
//	 glLineWidth(width); // 设置线粗细
//
//	 glBegin(GL_LINES);
//
//         glVertex2f(0.0f, 0.0f);
//         glVertex2f(0.5f, 0.5f);
//
//     glEnd();
//     glFlush();
//
//}


// 画虚线
//void myDisplay(void)
//{
//     glClear(GL_COLOR_BUFFER_BIT);
//
//     //glPointSize(10.0f);// 设置点大小
//	 GLfloat width = 2.0; 
//	 glLineWidth(width); // 设置线粗细
//	 glEnable(GL_LINE_STIPPLE); // 来启动虚线模式
//	 GLint factor = 2; 
//	 GLushort pattern = 0x3F07;
//	 glLineStipple(factor, pattern);
//
//	 /*
//	 从这个模式的低位开始,一个像素一个像素的进行处理。
//	 可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。
//	 factor参数 有点类似于虚线的放大倍数!!
//	 此时模式为Ox3F07(二进制形式为0011111100000111),
//	 它所画出来的直线是这样的:先连续绘制3个像素,然后连续5个像素留空,再连续绘制6个像素,最后两个像素留空(注意,首先是从低位开始的)
//	 */
//
//
//	 glBegin(GL_LINES);
//
//         glVertex2f(0.0f, 0.0f);
//         glVertex2f(0.5f, 0.5f);
//
//     glEnd();
//	 glDisable(GL_LINE_STIPPLE); // 来关闭虚线模式
//     glFlush();
//
//}

//void myDisplay(void)
//{
//     glClear(GL_COLOR_BUFFER_BIT);
//     glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
//     glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式
//     glFrontFace(GL_CCW);               // 设置逆时针方向为正面
//     glBegin(GL_POLYGON);               // 按逆时针绘制一个正方形,在左下方
//										// 四个顶点就是按照逆时针方向出现的,是反面
//         glVertex2f(-0.5f, -0.5f);
//         glVertex2f(0.0f, -0.5f);
//         glVertex2f(0.0f, 0.0f);
//         glVertex2f(-0.5f, 0.0f);
//
//     glEnd();
//
//     glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方
//										// 四个顶点就是按照顺时针方向出现的,是正面
//         glVertex2f(0.0f, 0.0f);
//         glVertex2f(0.0f, 0.5f);
//         glVertex2f(0.5f, 0.5f);
//         glVertex2f(0.5f, 0.0f);
//
//     glEnd();
//
//     glFlush();
//
//}

void myDisplay(void)      
{     
    //剔除正面示例  
    glClear(GL_COLOR_BUFFER_BIT);  
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);  
    glEnable(GL_CULL_FACE);  
    glCullFace(GL_FRONT);  
    glBegin(GL_POLYGON);  
    glVertex2f(0,0);  
    glVertex2f(-0.5,0);  
    glVertex2f(-0.5,-0.5);  
    glVertex2f(0,-0.5);  
    glEnd();  
    glBegin(GL_POLYGON);  
    glVertex2f(0,0);  
    glVertex2f(0,0.5);  
    glVertex2f(0.5,0.5);  
    glVertex2f(0.5,0);  
    glEnd();  
    glFlush();  
    glBegin(GL_POLYGON);  
    glVertex2f(0,0.5);  
    glVertex2f(0.5,0.5);  
    glVertex2f(0.5,0);  
    glVertex2f(0,0);  
    glEnd();  
    glFlush();  
}

int main(int argc, char* argv[])
{    
	glutInit(&argc, argv);  // glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  // glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
									// GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)
    glutInitWindowPosition(100, 100);  // 设置窗口在屏幕中的位置。
    glutInitWindowSize(400, 400);  // 设置窗口的大小
    glutCreateWindow("第一个OpenGL程序");  
    glutDisplayFunc(&myDisplay);  // 
    glutMainLoop();  // 进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)

	std::cout<<"END!"<<std::endl;

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值