位置: 编程技术 - 正文

SCARA——OpenGL入门学习三(opengl sharder)

编辑:rootadmin

推荐整理分享SCARA——OpenGL入门学习三(opengl sharder),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl skai,sgi opengl,opengl stl,openglass,openglass,opengl scale,opengl skai,opengl sc,内容如对您有帮助,希望把文章链接给更多的朋友!

OpenGL入门学习[三]

在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处。例如:点太小,难以看清楚;直线也太细,不舒服;或者想画虚线,但不知道方法只能用许多短直线,甚至用点组合而成。

这些问题将在本课中被解决。

下面就点、直线、多边形分别讨论。

1、关于点

点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:

void glPointSize(GLfloat size);

size必须大于0.0f,默认&#;为1.0f,单位为“像素”。

注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大&#;,则设置可能会有问题。

例子:

void myDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glPointSize(5.0f);

glBegin(GL_POINTS);

glVertex2f(0.0f, 0.0f);

glVertex2f(0.5f, 0.5f);

glEnd();

glFlush();

}

2、关于直线

(1)直线可以指定宽度:

void glLineWidth(GLfloat width);

其用法跟glPointSize类&#;。

(2)画虚线。

首先,使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)。

然后,使用glLineStipple来设置虚线的样式。

void glLineStipple(GLint factor, GLushort pattern);

pattern是由1和0组成的长度为的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。

以下是一些例子:

声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,年)已经流传于网络,我希望没有触及到版权问题。

示例代码:

void myDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_LINE_STIPPLE);

glLineStipple(2, 0x0F0F);

glLineWidth(.0f);

glBegin(GL_LINES);

glVertex2f(0.0f, 0.0f);

glVertex2f(0.5f, 0.5f);

glEnd();

glFlush();

}

3、关于多边形

多边形的内容较多,我们将讲述以下四个方面。

(1)多边形的两面以及绘制方式。

虽然我们目前还没有真正的使用三维坐标来画图,但是建立一些三维的概念还是必要的。

从三维的角度来看,一个多边形具有两个面。每一个面都可以设置不同的绘制方式:填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。可以为两个面分别设置不同的方式。

glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式

glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘绘制方式

glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式

(2)反转

一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。生活中常见的物体表面,通常都可以用这样的“正面”和“反面”,“合理的”被表现出来(请找一个比较透明的矿泉水瓶子,在正对你的一面沿逆时针画一个圆,并标明画的方向,然后将背面转为正面,画一个类&#;的圆,体会一下“正面”和“反面”。你会发现正对你的方向,瓶的外侧是正面,而背对你的方向,瓶的内侧才是正面。正对你的内侧和背对你的外侧则是反面。这样一来,同样属于“瓶的外侧”这个表面,但某些地方算是正面,某些地方却算是反面了)。

但也有一些表面比较特殊。例如“麦比乌斯带”(请自己Google一下),可以全部使用“正面”或全部使用“背面”来表示。

可以通过glFrontFace函数来交换“正面”和“反面”的概念。

glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针

glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针

下面是一个示例程序,请用它替换第一课中的myDisplay函数,并将glFrontFace(GL_CCW)修改为glFrontFace(GL_CW),并观察结果的变化。

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

}

(3)剔除多边形表面

在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。

首先,使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)

然后,使用glCullFace来进行剔除。

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

注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。

(4)镂空多边形

直线可以被画成虚线,而多边形则可以进行镂空。

首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。

然后,使用glPolygonStipple来设置镂空的样式。

void glPolygonStipple(const GLubyte *mask);

SCARA——OpenGL入门学习三(opengl sharder)

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

但是,如果我们直接定义这个mask数组,像这样:

static GLubyte Mask[] =

{

0x, 0x, 0x, 0x, // 这是最下面的一行

0x, 0x, 0x, 0x,

0x, 0x, 0x, 0xC0, // 麻

0x, 0xC0, 0x, 0x, // 烦

0x, 0x, 0x, 0x, // 的

0x, 0x, 0x0C, 0x, // 初

0x, 0x, 0x, 0x, // 始

0x, 0x0C, 0x, 0x, // 化

0x, 0x, 0x, 0x, // ,

0x, 0x, 0xC0, 0x, // 不

0x, 0x, 0x, 0x, // 建

0x, 0x, 0x, 0x, // 议

0x, 0x, 0x, 0x, // 使

0x, 0x, 0x, 0x, // 用

0x, 0x, 0x, 0x,

0x, 0x, 0x, 0x,

0x, 0x, 0x, 0x,

0x, 0x, 0x, 0xCC,

0x, 0x, 0x, 0x,

0x0C, 0xC1, 0x, 0x,

0x, 0xE1, 0x, 0xE0,

0x, 0x3F, 0xFC, 0xC0,

0x, 0x, 0x8C, 0xC0,

0x, 0x3F, 0xFC, 0xC0,

0x, 0x, 0x, 0x,

0x0C, 0xCC, 0x, 0x,

0x, 0xCC, 0x, 0x,

0x, 0xC4, 0x, 0x,

0x, 0x, 0xC6, 0x,

0x, 0x, 0x0C, 0x,

0x, 0x, 0x, 0x,

0x, 0x, 0x, 0x // 这是最上面的一行

};

这样一堆数据非常缺乏直观性,我们需要很费劲的去分析,才会发现它表示的竟然是一只苍蝇。

如果将这样的数据保存成图片,并用专门的工具进行编辑,显然会方便很多。下面介绍如何做到这一点。

首先,用Windows自带的画笔程序新建一副图片,取名为mask.bmp,注意保存时,应该选择“单色位图”。在“图象”->“属性”对话框中,设置图片的高度和宽度均为。

用放大镜观察图片,并编辑(在图上单击)之。黑色对应二进制零(镂空),白色对应二进制一(不镂空),编辑完毕后保存。

然后,就可以使用以下代码来获得这个Mask数组了。

static GLubyte Mask[];

FILE *fp;

fp = fopen("mask.bmp", "rb");

if( !fp )

exit(0);

// 移动文件指针到这个位置,使得再读sizeof(Mask)个字节就会遇到文件结束

// 注意-(int)sizeof(Mask)虽然不是什么好的写法,但这里它确实是正确有效的

// 如果直接写-sizeof(Mask)的话,因为sizeof取得的是一个无符号数,取负号会有问题

if( fseek(fp, -(int)sizeof(Mask), SEEK_END) )

exit(0);

// 读取sizeof(Mask)个字节到Mask

if( !fread(Mask, sizeof(Mask), 1, fp) )

exit(0);

fclose(fp);

好的,现在请自己编辑一个图片作为mask,并用上述方法取得Mask数组,运行后观察效果。

说明:绘制虚线时可以设置factor因子,但多边形的镂空无法设置factor因子。请用鼠标改变窗口的大小,观察镂空效果的变化情况。

#include <stdio.h>

#include <stdlib.h>

void myDisplay(void)

{

static GLubyte Mask[];

FILE *fp;

fp = fopen("mask.bmp", "rb");

if( !fp )

exit(0);

if( fseek(fp, -(int)sizeof(Mask), SEEK_END) )

exit(0);

if( !fread(Mask, sizeof(Mask), 1, fp) )

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

}

运行结果:

小结

本课学习了绘制几何图形的一些细节。

点可以设置大小。

直线可以设置宽度;可以将直线画成虚线。

多边形的两个面的绘制方法可以分别设置;在三维空间中,不可见的多边形可以被剔除;可以将填充多边形绘制成镂空的样式。

了解这些细节会使我们在一些图象绘制中更加得心应手。

另外,把一些数据写到程序之外的文件中,并用专门的工具编辑之,有时可以显得更方便。

===================== 第三课 完 =====================

=====================TO BE CONTINUED=====================

版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenGL Tutorial: (1) Setting up OpenGL with Visual Studio 前言我们准备要开始OpenGL之旅,在开始之前,首先要了解一些事情,也就是本教程的目的,请确定本教程与您的目标一致,以免浪费时间。如果您有任

作战仿真 基于 osg 含有态势显示 客户端 转载请注明出处:

对Android opengl ES世界坐标系和纹理坐标系的理解 初学openglES,每一个教你在屏幕上贴图的opengl版helloworld都有这么两数组:staticfinalfloatCOORD[]={-1.0f,-1.0f,1.0f,-1.0f,-1.0f,1.0f,1.0f,1.0f,};staticfinalfloatTEXTURE_COORD[]={0.0f

标签: opengl sharder

本文链接地址:https://www.jiuchutong.com/biancheng/368430.html 转载请保留说明!

上一篇:OpenGL纹理贴图的相关知识(opengl纹理采样)

下一篇:OpenGL Tutorial: (1) Setting up OpenGL with Visual Studio

  • 放弃退税理由是什么
  • 增值税进项税会计处理
  • 小规模经营租赁开票税率
  • 安防视频监控工程项目
  • 补缴税款的会计怎么做账
  • 什么情况需要预缴增值税
  • 有会计从业资格证还有用吗
  • 支付的检测费计入什么科目
  • 幼儿园伙食收支盈亏比例
  • 长期待摊费用摊销表
  • 应交税费减免税款
  • 可变股权转让对价会计处理怎么做?
  • 员工借款后离职怎么办
  • 企业月奖金发放制度
  • 律师行业税务如何做账
  • 非正常损失允许税前扣除吗
  • 税务返还手续费发放给个人需要合并扣税吗
  • 纳税申报一般什么时候
  • 跨年成本发票红冲怎么做会计分录
  • 网上勾选认证每月时间要求
  • 发出商品确认收入的条件
  • 给员工发放购物卡交个税吗
  • 专票电话写错了怎么办
  • 银行扣的短信费银行给开发票吗
  • win11系统的电脑中拷贝到U盘中的文件没有了怎么解决
  • 个人如何办理住房贷款
  • 绣球花的叶子出现了斑点,这是怎么了?
  • 电脑卡住了按什么键回到桌面
  • element_ui
  • 单目标优化函数
  • 主营业务利润率多少合适
  • 注册造价师挂靠费怎么缴纳个税
  • 其他业务支出属于什么会计科目
  • pnp算法简介与代码解析
  • 大堡礁分布在澳大利亚的哪里
  • 企业应交税费科目
  • 因税收取得的票据是什么
  • 优秀员工奖励现金是工资还是福利
  • 专票认证对企业有影响吗
  • 与上级往来的会计科目的题目
  • 固定资产加速折旧是什么意思
  • 个人独资企业用企业资金进行个人消费
  • mysql中触发器的创建有多个执行语句
  • 呆账核销账务处理程序
  • 银行开户有几种账户
  • 盈余公积转增资本所有者权益会变吗
  • 发票报销哪些要素不能少
  • 别人公司过账用自己的银行卡会查吗
  • 房地产预缴所得税的计税基础
  • 企业所得税的计税步骤
  • 春节补贴是正数还是负数
  • 开具红字专用发票理由
  • 以前年度损益调整会计分录
  • 财税人员岗位职责
  • 费用报销单填写标准
  • 汽车销售企业的资产有哪些
  • 成本核算应设置哪些会计账户
  • sqlserver提示功能怎么打开
  • MS DTC 事务管理器无法启动的解决方案
  • 在64位的Ubuntu系统上安装32位的WPS的方法
  • ubuntu 4.10
  • 1sass.exe是什么程序
  • win7电脑老是跳出弹窗广告怎么办
  • win10 Build 10565中Edge浏览器新增对HTML5视频的播放控制及下载
  • linux的ssr
  • Extjs EditorGridPanel中ComboBox列的显示问题
  • android入门书
  • html淘宝搜索框代码
  • media and
  • Linux文本处理工具的实验总结
  • 批处理清空文本内容
  • 简述python的垃圾回收机制
  • js类的实现
  • python全角半角
  • 湖南省税务局网站2024公务员招聘
  • 水电费加1
  • 进口天然气定价机制
  • 辽宁地税电子税票查询
  • 讨论如何做好寺庙管理服务工作
  • 出口退税函调不予退税的后果
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设