opemgl(四)

之前点或者线的大小是固定的为一个像素,然而我们可以通过一些方法改变。(昨天有些小问题我修改了一下)

如果是改变点的话就可以使用glPointSize()里面的参数是大小。

    #include <GL/glut.h>
    void Display()
    {  

        glClear(GL_COLOR_BUFFER_BIT);  

        glPointSize(30.0f);  

        glBegin(GL_POINTS);  

        glVertex2f(-0.5f, -0.5f);  

        glVertex2f(0.5f, 0.5f);  

        glEnd();  

        glFlush();  

    }  

    int main(int argc, char *argv[])  

    {  

        glutInit(&argc, argv);  

        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  

        glutInitWindowPosition(200, 200);  

        glutInitWindowSize(400, 400);  

        glutCreateWindow("第一个OpenGL程序");  

        glutDisplayFunc(&Display);  

        glutMainLoop();  

        return 0;  

    }  

那么这个点就会变成很多像素组成的了。

直线同理,使用glLineWidth()这个就可以了。

直线还可以进行话虚线的处理。

首先应该启动画虚线的模式glEnable(GL_LINE_STIPPLE);

在使用函数:void glLineStipple(GLint factor, GLushort pattern);//先来介绍第二个参数,第二个是二进制的16的序列,Ox3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先连续绘制3个像素,然后连续5个像素留空,再连续绘制6个像素,最后两个像素留空(注意,首先是从低位开始的)。

代码是这样的:

    #include <GL/glut.h>
    void Display()
    {  

        glClear(GL_COLOR_BUFFER_BIT);  

        glEnable(GL_LINE_STIPPLE);  

        glLineStipple(2, 0x0F0F);  

        glLineWidth(10.0f);  

        glBegin(GL_LINES);  

        glVertex2f(0.0f, 0.0f);  

        glVertex2f(0.5f, 0.5f);  

        glEnd();  

        glFlush();  

    }  

    int main(int argc, char *argv[])  

    {  

        glutInit(&argc, argv);  

        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  

        glutInitWindowPosition(200, 200);  

        glutInitWindowSize(400, 400);  

        glutCreateWindow("第一个OpenGL程序");  

        glutDisplayFunc(&Display);  

        glutMainLoop();  

        return 0;  

    }  

效果是这样的,因为我选择的模式是0101010101010101的。所以显示出来的就是这样的。

现在来说多边形,一般的多边形是有两种面的,正面和反面每个面可以选择不同的方式来绘制,填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。

需要使用原型是:void glPolygonMode(GLenum face,GLenum mode);来确定怎么绘制。

face这个参数确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的绘图模式:

GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)

GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)

GL_FRONT_AND_BACK表示显示模式将适用于物体的所有面

mode这个参数确定选中的物体的面以何种方式显示(显示模式):

GL_POINT表示显示顶点,多边形用点显示

GL_LINE表示显示线段,多边形用轮廓显示

GL_FILL表示显示面,多边形采用填充形式

这是参数,可以选择喜欢的(但是在高版本中只接受GL_FRONT_AND_BACK作为face的值)。

(二)

一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。

多边形的正反面可以通过void glFrontFace(GLenum mode);来改变(和绘图时的方向有关)

作用是控制多边形的正面是如何决定的。在默认情况下,mode是GL_CCW。

mode的值为:

GL_CCW 表示窗口坐标上投影多边形的顶点顺序为逆时针方向的表面为正面。

GL_CW 表示顶点顺序为顺时针方向的表面为正面。

    #include <GL/glut.h>
    void Display()
    {  

        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();  

    }  

    int main(int argc, char *argv[])  

    {  

        glutInit(&argc, argv);  

        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  

        glutInitWindowPosition(200, 200);  

        glutInitWindowSize(400, 400);  

        glutCreateWindow("第一个OpenGL程序");  

        glutDisplayFunc(&Display);  

        glutMainLoop();  

        return 0;  

    }  

(三)

在空间中,可以把不可见的多边形表面提出

glEnable(GL_CULL_FACE)先要启动模式,然后使用函数glCullFace()来提出

glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。

(四)

和线段一样,多变型也可以镂空的。glEnable(GL_POLYGON_STIPPLE)来启动怎么镂空。

然后使用void glPolygonStipple(const GLubyte *mask);来进行镂空。

其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。

这是代码:

    #include <GL/glut.h>
    #include<stdio.h>
    #include<stdlib.h>
    void Display()
    {  

        static GLubyte Mask[128];  

        FILE *fp;  

        fp = fopen("C:/Users/Administrator/Pictures/mask.bmp", "rb");  

        if (!fp)  

            exit(0);  

        if (fseek(fp, -(int)sizeof(Mask), SEEK_END))//把文件指到第一个字节的位置  

            exit(0);  

        if (!fread(Mask, sizeof(Mask), 1, fp))//开始把读到的放在mask的内存区域中  

            exit(0);  

        fclose(fp);  

        glClear(GL_COLOR_BUFFER_BIT);  

        glEnable(GL_POLYGON_STIPPLE);  

        glPolygonStipple(Mask);  

        glRectf(-0.5f, -0.5f, 0.0f, 0.0f);   // 在左下方绘制一个有镂空效果的正方形  

        glDisable(GL_POLYGON_STIPPLE);  

        glRectf(0.0f, 0.0f, 0.5f, 0.5f);     // 在右上方绘制一个无镂空效果的正方形  

        glFlush();
    }  

    int main(int argc, char *argv[])  

    {  

        glutInit(&argc, argv);  

        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  

        glutInitWindowPosition(200, 200);  

        glutInitWindowSize(400, 400);  

        glutCreateWindow("第一个OpenGL程序");  

        glutDisplayFunc(&Display);  

        glutMainLoop();  

        return 0;  

    }  

(不要在意内容)黑色的是镂空的,白色的是不镂空的。

时间: 2024-10-07 18:59:04

opemgl(四)的相关文章

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

13- 整数划分插入乘号积最大(四)

/*                                            整数划分(四)时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷..亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积 输入    第

java-分支结构(四种基本分支结构的认识)

分支结构:有条件的执行某语句,并非每句必走 1)if结构:1条路 2)if...else结构:2条路 3)if...else if结构:多条路 4)switch...case结构:多条路 优点:效率高.结构清晰 缺点:整数.相等 break:跳出switch 一.if结构的认识 /* * 1.if结构:1条路 * 1)语法: * if(boolean){ * 语句块 * } * 2)执行过程: * 判断boolean的值: * 若为true,则执行语句块 * 若为false,则不执行语句块 */

TCP四次挥手(断开连接)(未完待续)

正常情况下,调用close(),其中产生的一个效果就是发送FIN. 断开为什么需要四次握手: TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了:但是,这个时候主机1还是可以接受来自主机2的数据:当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的:当主机2也发送了FIN报文段时,这个时候就表示主

《Inside C#》笔记(四) 类

类是对数据结构和算法的封装. 一 类成员 类成员包括以下几类,作者在后面的章节会详细讲解. 字段(用来保存数据,可用static readonly const来修饰).方法(操作数据的代码).属性(用来控制对类内部变量的访问).常量.索引器.事件和运算符. 二 访问修饰符 public 可被外部的类和派生类访问 protected 只能被派生类访问 private 外部的类和派生类都不能访问 internal 程序集内部可访问 不管类本身还是类成员默认的修饰符都是private 三 Main 函

2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告

北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构  班级: 1623  姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5月26日 实验密级:非密级 预习程度: 优良 实验时间: 2 Hours 仪器组次: 必修/选修: 必修 实验序号: 04 实验名称:Java面向对象程序设计Android开发 实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI

MySQL 四种事务隔离级的说明[转]

很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别.例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMM

Linux高级文本处理之sed(四)

模式空间是sed内部维护的一个缓存空间,它存放着读入的一行或者多行内容.但是模式空间的一个限制是无法保存模式空间中被处理的行,因此sed又引入了另外一个缓存空间--模式空间(Hold Space). 一.保持空间 保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间.sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容. 操作保持空间的命令如下所示: 这几组命令提供了保存.取回以及交换三个动作,交换命令比较容易理解,

Hadoop核心组件:四步通晓HDFS

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统,它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序,那么在实际应用中我们如何来操作使用呢? 一.HDFS操作方式: 1.  命令行操作 –FsShell:$ hdfs dfs 2. 其他的计算框架-如spark 通过URI,比如: hdfs://nnhost:port/file-,调用HDFS的协议.主机.端口或者对外提供的服务媒.以及文件,在spark的程序中实现对HDFS的访问. 3.  其