2012年7月第21期科技视界
Science&Technology Vision
作为一种开放的3D图形程序接口规范,OpenGL在和其对手DirectX的不断竞争中,应用越来越广泛。在CAD设计、游戏开发、虚拟现实等行业领域中,OpenGL能够帮助程序开发人员充分发挥计算机工作站等硬件设备的高性能,赋予应用超级表现力。在发展迅速的移动终端领域(手机、平板电脑等),OpenGL的嵌入式版本OpenGL ES更取得了卓越的成就。苹果手机的iOS平台和Google的Android平台的3D标准都是OpenGL ES,而移动通讯芯片领域的霸主高通在其移动显示芯片GPU Adreno也全部内置支持OpenGL ES。
尽管现在智能手机的处理速度越来越快,运行资源越来越打,但考虑到减少能耗,程序员仍然需要在开发中尽量降低资源开销。
利用OpenGL绘制三维场景时,基本上就是对组成场景的多边形进行处理。为了产生真实的效果,通常我们需要给多边形加上纹理、光照等效果,这时需要消耗的资源也较多。为了减少资源占用,在比较简单的场景也可以将多边形使用图案进行填充来代替纹理贴图。通常,在OpenGL中的图案填充都是规则的简单图形,如45度斜线填充、黑白棋盘填充等等。复杂的填充则涉及到填充图案的构造,难度较大。
本文提出一种能够实现任何复杂图案的多边形填充方案。
我们知道在OpenGL中绘制多边形可以使用函数glBe⁃gin(GL_POLYGON)来实现,如果没有指定各顶点的颜,则OpenGL就使用当前颜填充多边形,如果指定了各顶点的
颜,则OpenGL就使用各顶点的混合颜填充多边形。如果要对多边形进行图案填充,则需要实现设置多边形的绘制模式。
确定多边形绘制模式的函数是glPolygonMode,它可以设置多边形是以边界线方式绘制,还是以填充方式绘制,甚至可以仅画出组成多边形的几个顶点。glPolygonMode函数的原型如下,它决定多边形光栅化的模式。
void glPolygonMode(
GLenum face,
GLenum mode
);
face是指需要处理的多边形的哪个面,GL_FRONT表示仅作用于多边形的前面,GL_BACK表示仅作用于多边形的后面,GL_FRONT_AND_BACK表示同时作用于前面和后面两个面。mode表示绘制多边形的方式,
GL_POINT表示仅仅以标记各顶点的方式来绘制多边形;GL_LINE表示以线段方式绘制多边形的外轮廓;GL_FILL是缺省的方式,表示对多边形完全填充。
图145度斜线填充图案
对绘制填充的多边形时,填充图案就可以进行自定义了。定义填充图案的函数是glPolygonStipple,其原型如下:
void glPolygonStipple(
const GLubyte*mask
);
fopen和open区别
在OpenGL中,填充图案以一个32x32的二维数组表示,每一位表示一个像素的点,为1时表示填充,为0时表示不填充。一个图案需要的字节数是32x32/8=128个。参数mask 就是指向这一个图案数据的指针。
OpenGL中基于位图的多边形复杂图案填充
陈婷婷
(十堰广播电视大学〈教育学院〉湖北十堰442000)
【摘要】OpenGL中对多边形的填充通常使用的是一些容易定义的简单图形,使用复杂图案填充时需要实现对图案进行分解以得到一个复杂的图案定义。本文提出一种基于位图的方案,避免了图案的复杂定义,提高效率,使OpenGL开发者能够集中于应用的设计。
【关键词】OpenGL;填充模式;位图
作者简介:陈婷婷,湖北十堰广播电视大学(教育学院)理工部计算机专业教师,讲师
IT论坛
. All Rights Reserved.
2012年7月第21期
科技视界
Science &Technology Vision
和线型的定义一样,填充图案的处理也是从低位开始。例如,45度斜线的填充图案如图1,其定义就是GLubyte pattern[]={
0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,
0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01
};
对一个正六边形使用该填充图案进行填充后的效果如
图2所示。
图2简单多边形填充
但对于不规则的图案,很难使用上述的填充图案定义方式,如图3所示。这种图案难以通过手工计算方式得到上面用于填充的pattern 数组。
图3复杂填充图案
其实从对填充图案的定义就可以看出,填充图案本质上本身就是一种位图,不过只是单位图而已。因此,我们可以通过位图来解决复杂图案的设计,这个图案可以是任意的。这样也可以节省对填充图案的定义,只要能够在画笔中画出来即可,或者利用其它图片转换成位图。
Windows 系统中的BMP 位图颜有单、16、256、
16位、24位和32位之分,因为填充图案没有颜信息,因此只能使用单位图。非单位图必须转换成单位图才可以用于多边形填充。
BMP 单位图的存储方式和常规理解不同,它是某位0表示有图案,1表示没有图案.也可是说0表示黑,1表示白,和多边形填充图案的定义刚好相反。因此,在读取位图填
充图案时还需要进行一次转换。
例如,我们把如下单32X32的位图应用到六边行作为填充图案。
//定义填充图案GLubyte
pattern[128];
IT 论坛
. All Rights Reserved.
//OpenGL的初始化函数,被Win32应用程序的初始化函数InitInstance调用
int glInit()
{
//启用阴影平滑(Smooth Shading)。glShadeModel(GL_SMOOTH);
glClearColor(1.0f,1.0f,1.0f,1.0f);
//设置深度缓冲
glClearDepth(1.0f);
//启动深度测试
glEnable(GL_DEPTH_TEST);
//深度测试的类型
glDepthFunc(GL_LEQUAL);
//进行透视修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
FILE*fp;
//从pattern.bmp中读取图案数据.pattern.bmp文件是图3所示的图案文件
fp=fopen("pattern.bmp","rb");
if(!fp)
{
MessageBox(NULL,TEXT("读取图案文件失败"),TEXT("提示"),MB_OK);
return-1;
}
fseek(fp,0x3e,SEEK_SET);
fread(pattern,128,1,fp);
fclose(fp);
for(int i=0;i<128;i++)
{
//将BMP文件存储的数据格式转换成填充图案要求的格式
pattern[i]=pattern[i]^0xff;
}
return TRUE;
}
//OpenGL主函数,在WinMain的While消息处理循环体中调用
void glMain()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();//加载单位矩阵glTranslatef(0.0f,0.0f,-3.0f);
glColor3f(0.0f,0.0f,0.0f);
/*绘制一个指定图案填充的矩形*/
//启用填充
glEnable(GL_POLYGON_STIPPLE);
//指定填充图案glPolygonStipple(pattern);
//填充六边形
glBegin(GL_POLYGON);
glVertex3f(1.0,0.0,0.0);
glVertex3f(0.5,0.866,0.0);
glVertex3f(-0.5,0.866,0.0);
glVertex3f(-1.0,0.0,0.0);
glVertex3f(-0.5,-0.866,0.0);
glVertex3f(0.5,-0.866,0.0);
glEnd();
//交换前后缓冲区
SwapBuffers(g_hDC);
}(下转第108页)图4BMP 复杂位图填充多边形
. All Rights Reserved.
(上接第134页)程序运行后,可以看到填充图案效果如图4所示。从表面上看起来和纹理贴图有些类似,但是根据前面建立和实现填充图案的过程可以看到,两者本质上还是不同的。
本文程序使用Visual C++6.0开发,在Windows XP 系统下运行通过。除文中所示的代码外,其他代码均基于Visual C++6.0自动生成的Win32程序修改而成。修改部分主要是程序的初始化部分增加OpenGL 的初始化过程,详细代码可
参阅下列参考文献部分。
【参考文献】
[1][美]施瑞奈尔,等.OpenGL 编程指南[M].李军,等,译.机械工业出版社,2010.
[2][美]Richard S Wright,Benjamin Lipchak.OpenGL 超级宝典[M].徐波,译.人民邮电出版社,2005.
[3]OpenGL 系统设计,LotusOne,blog.csdn/lotusone [4]NeHe Productions -Everything OpenGL,Jeff,Molofee,nehe.gamedev/.
[5]OpenGL Specifications,/.
[6]OpenGL ES Programming Guide for iOS,Apple Inc.,developer.ap⁃ple/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_Pro⁃grammingGuide/OpenGLES_ProgrammingGuide.pdf.
[7]OpenGL ES 2.0Programming Guide,Aaftab Munshi,Dan Ginsburg,Dave Shreiner,Addison-Wesley Professional Press,2008.
[责任编辑:周娜
]
3校企合作实训教学的实施
3.1
引企入校,搭建了“1-4-2-4”实训教学模式
本会计电算化专业通过与吉林鑫研税务师事务有限责
任公司签订协议,将该公司的会计三部(该公司的主要业务是财务会计、税务代理)引进学院,建立会计电算化专业校内实习基地,形成了一个平台、四个岗位、双导师和四个真实的“1-4-2-4”的实训教学模式。一个平台:长春职业技术学院与吉林鑫研税务师事务有限责任公司双方合作,共同建立校内实习基
地,形成了一个校企合作的紧密型校内实训教学平台;四个岗位:引进的公司会计三部下设会计部经理(会计主管)、出纳会计、核算会计、纳税会计四个会计岗位,学生轮岗进行会计实际业务实习实训;双导师:学生实习实训由学院会计专业教师与企业会计师共同指导来完成;四个真实:学生实习实训依托该公司会计三部在真实工作环境、真实业务流程、真实企业资料、真实会计岗位中完成。3.2
完成的实训项目
在这个实训教学模式下,遵循学生会计实训的认知规律,按照从简单到复杂、由单项到综合的实践过程,完成了以下实习实训项目:
3.2.1专业认识实习。由任课教师组织入校新生到校外和校内实习基地和进行认识实习。通过观看及聆听企业会计人员
介绍,体验企业会计工作氛围;了解会计工作流程和会计岗位设置及其岗位职责;感受企业真实的会计凭证、账簿和报表等会计档案资料;分享毕业学生的校内实习实训作品,使学生对会计工作有了初步的了解和认识,为基础会计的学习奠定了基础。
3.2.2商业企业会计实训。多年来一直聘请该公司有多年会计实际工作经验的会计师、税务师承担商业企业会计实训课程的指导工作,并把该公司所代理企业的完整会计资料引入
课堂,作为学生校内实训教材,学生在课堂上亲身体验到企业发生的纷繁复杂的实际会计业务(各种票据),并将其放在真实环境,真实流程,真实会计岗位中去操作,学生感受到了真实的会计工作。
3.2.3纳税申报实习。由任课教师组织6—8人一组,利用课余时间分别到校内实习基地由该企业的会计师指导如何办理税务登记、填写各种税收申报表以及网上申报系统的使用,并由企业会计师带领每组学生到税务部门的申报大厅进行实际纳税申报。使学生熟悉了纳税申报的操作技能,就业后能够顺利接手纳税申报工作。3.2.4
结合会计专业开设的课程,任课教师根据课程教学的
需要,利用课余时间组织学生到校内实习基地进行具体会计岗位业务实习。不断解决了实践教学中出现的新情况以及疑
难问题。
3.2.5共同开发实训教材
通过与该企业的会计师共同开发了会计岗位基础实训、会计信息化实训和企业会计综合实训教材,为会计电算化专业学生的实训提供了适用的真实的实训资料。
【参考文献】
[1]冼柏忠.对会计专业实践教学的探讨[J].中国集体经济,2012(10).[2]柏广才,王亚.高职院校会计类专业实践性教学的实践与思考[J].商业会计,2011,11(32).[3]周云凌.高职院校会计类专业实践性教学的实践与思考[J].商业会计,2011,11(33).[4]周云凌.高职院校会计类专业实践性教学的实践与思考[J].商业会
计,2011,11(33).
[责任编辑:王洪泽
]
. All Rights Reserved.