// 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;
}