《OpenGL编程基础》第二章笔记2

今天没有什么实质性的内容,第二章中为了讲解glEdgeFlag函数,特别讲了一个拆分三角形的例子,但是其实是展现了一下递归的作用。没有什么特别。

那我今儿干脆把自己这两天笔记里的几块代码拼成一个完整的田地好了:

#include<GL/glut.h> /*Moc Os 应该使用<glut/glut.h> */

void display(){
/*干各种你要干的码农活儿,例如灯光,效果,沙滩,菠菜,加班,等等。。*/
	glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写

	glBegin(GL_TRIANGLES);//开始画三角形

            glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
            glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)
            glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
            glVertex2f(1.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)
            glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
            glVertex2f(0.0,1.0);//设置第三个顶点的坐标为(-0.5,1.0)

	glEnd();//三角形结束
	glFlush();//强制OpenGL将结果呈现到屏幕上。
}
void myReshape(GLsizei w,GLsizei h){
/*大力渲染、鼓吹各种你干了的的码农活儿,例如灯光,效果,沙滩,菠菜,加班,等等。。*/
    glViewport(0,0,w,h);//设置视口
}

/* 主函数*/
int main(int argc, char** argv){

/*在任何glut的方法被调用前,调用这个函数,否则没有种子,袁隆平也救不了你。 */
glutInit(&argc, argv);

/*这里会创建一个标题为“码农标准田”的窗口。就是码农的地了,没有地,好像袁隆平依然救不了你。不知道试管田产量如何。。 */
glutCreateWindow("码农标准田");

/*注册回调,告诉老板领导你都准备干什么 */
/* 参数 display 就是上面那些个灯光沙滩以及加班*/
glutDisplayFunc(display);
glutReshapeFunc(myReshape);

/*glutMainLoop这个函数使程序进入无限循环,不断的展示我们display里的效果、沙滩、纹理、加班,*/
/*直到窗口关闭,田地被摧毁,或者收到其他交互事件。比如按键事件、鼠标事件等老板领导们发放的新需求、新政策等*/
glutMainLoop();

/*因为上面的循环,之后的代码将不会被执行,包括下面的return语句。这是《OpenGL 编程基础》中告诉我的,没有验证,待验证。*/
return 0;

}

田地代码如上。


顺手记录一些tips:

1 glLineStipple(GLint factor, GLushort pattern)函数

该函数作用是按照pattern的模式绘制一条虚线,pattern是一个16位二进制数,对pattern中,每一位如果是1,那么在直线上一个像素的颜色,如果为0,当前像素不填充颜色,例如,当factor的值是1,pattern的值是0x0001, 那么pattern只有最低一位是1其他15位都是0(既0000000000000001)那么,在画线段时,这条线段上,每16个像素只有1一个像素有颜色,也就是说,这个线段的上的每个可以看到的点都相聚15个像素。

再看看factor参数,factor参数的作用是,在按照pattern绘制时,按照pattern的每一位去绘制factor次。比如,还是刚才的例子,当factor的值为2时,会先连续画1x2=2个像素,然后跳过(15x2=30)个像素。就是线段上每2个连续的像素之间间隔30个像素。就好象,线段被放大了一样。

这个函数需要打开OpenGL的点划功能:

glEnable(GL_LINE_STIPPLE);

OpenGL中建议在不许要相应功能时将其关闭:

glDisable(GL_LINE_STIPPLE);

其他功能类似处理。


2 glEdgeFlage(GLboolean flag) 函数

这个函数的作用是,以该函数以后设置的顶点为起点的线段(或边)是否显示。

需要所绘制的多边形为LINE模式:

glPolygonMode(GL_FONT, GL_LINE);

例如

	glBegin(GL_POLYGON);//开始画多边形
        //glShadeModel(GL_FLAT);//设置为光滑明暗模式
        glEdgeFlag(GL_TRUE);//以(-0.5, -0.5)为起点的线段将被显示
        glVertex2f(-0.5, -0.5);

        glEdgeFlag(GL_FALSE);//以(0.5, -0.5)为起点的线段将被显示将不显示
        glVertex2f(0.5, -0.5);

        glEdgeFlag(GL_TRUE);//以(0.0, -0.5)为起点的线段将被显示将显示。如果,注掉这个函数,那么这个顶点也不显示,因为在之前设置过一次glEdgeFlag(GL_FALSE)
        glVertex2f(0.0, 0.5);
	glEnd();//多边形结束
 glPolygonMode(GL_FONT, GL_LINE);//设置多边形模式为LINE模式。


顺带一提,CodeBlock有一些操作上的bug。比如build总是不更新代码,鼠标点击代码编辑框的关闭按钮没有响应等等。。有点小郁闷。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值