贸商网本站服务帮助中心手机版

贸商网

  • 全站
  • 招商
  • 供应
  • 求购
  • 产品
  • 资讯
  • 展会
  • 企业
您现在的位置:贸商网 > 资讯中心 > 物联网 > [连载]OpenGL_ES基础入门(五)-材质纹理

[连载]OpenGL_ES基础入门(五)-材质纹理

时间:2017-07-03  作者:贸商网  点击:37  评论:  字体:T|T

材质纹理是增加物体表面细节的有效手段。前面我们已经可以加载任意复杂的三维模型了,但是白乎乎的团,看着一点也不酷,现在是时候让它变漂亮一些了。

第一步我们给它上点颜色。首先我们需要对光照模型有点概念,物体看上去有颜色,是它被光线照射的结果,如果光是白色的,那么呈现的就是物体本身的颜色,否则会是光色和表面本色综合的结果。物体表面被点光源照射后,会呈现三个区域:高光区、过渡色区和环境色区。高光区是镜面反射的结果,亮度特别高,光源越强越明显;过渡色区是漫反射的结果,通常面积较大;环境色区则是不受光照部份的颜色,通常较暗。

OpenGL ES提供了API供我们为物体表面指定这三个区域的颜色:void glMaterialx(GLenum face, GLenum pname, GLfixed * param);
GLfixed specmat[4] = { 1<<16, 0, 0, 0 };
GLfixed diffmat[4] = { 0, 1<<16, 0, 0 };
GLfixed ambmat [4] = { 0, 0, 1<<16, 0 };

glMaterialxv( GL_FRONT, GL_SPECULAR, specmat );
glMaterialxv( GL_FRONT, GL_DIFFUSE, diffmat );
glMaterialxv( GL_FRONT, GL_AMBIENT, ambmat );
... draw code ...

在之前的加载模型示例程序中使用以上材质后的效果:

1

注意,既然颜色与光照有如此密切的关系,如果不调用以下两行代码:
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
以启用光照计算,绘制结果将会是:

2

如果你看过Hello EGL例子,你会发现在不启用光照计算时,也可以直接用COLOR_ARRAY来给表面上色,但这并不是一般意义上的材质。

给模型表面上色之后,看上去漂亮多了,不过这样还是不足以表达复杂的表面细节,如果物体表面不是大面积的色块而是复杂的花纹,那就需要通过纹理贴图来表现了。实际上,纹理贴图是游戏类图形程序最重要的工作,针对娱乐市场开发的显示卡其优化重点也是增加显卡总线带宽以便更快速度的将纹图贴图从系统内存传递到显卡处理流水线中以及并行根据纹理计算每个像素点最终颜色。而所谓专业图形卡则更重视于线条等基本图元的发生处理能力。

在OpenGL ES中给一个面指定纹理有四步:在内存里准备好纹理数据,调用glTexImage2D将纹理数据上传给显卡并设置当前纹理,设置贴图参数,在绘制面时提供纹理坐标(uv)。

OpenGL ES限制纹理图片的长和宽都必须是2的次方,长和宽可以不一样。以下这段代码在生成一个128x128的图片并保存到数组embText里:
1unsigned short embTex[128*128];
2unsigned short color[4]={ 0xF800, 0x7E0, 0x1F, 0xffff };
3for ( int i = 0; i < 128; ++i )
4{
5for ( int j = 0; j < 128; ++j )
6{
7embTex[i*128+j] = color[(i/32 + j/32)%4];
8}
9}
10

在实际应用中,纹理图片通常需要从特写格式的文件中读取,像tga之类的文件格式比较简单,而jpg/gif则相当复杂但压缩率高,多数游戏会采用自定义格式的文件,这样不仅可以按需要对格式进行优化,也可以提供简单的资源保护。
纹理数据放进内存之后,就可以调用glTexImage2D将其上传到显存里并通知流水线将其作为“当前”纹理:
11 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 128, 128 , 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, embTex);

参数的意义是相当直接的:
1. target: GL_TEXTURE_2D表示定义一个二维纹理,实际上这是目前OpenGL ES支持的唯一一个值;
2. level: LOD级数,每一级LOD纹理是上级纹理长宽各缩小一半的图片。如果使用这个纹理的面由于距离或角度,实际可见面积很小,流水线会选用适当级别的纹理来绘制它,这样可以避免实时缩小图片而需要的大量计算。
3. internalFormat:内部格式,指定纹理中的颜色组分数量,用象GL_RGB这样的符号常量。可以想象OpenGL ES只支持几种最常用的格式。简单而言之,这个参数定义纹理在显存中的格式。后面还有一个format,那是说明内存中的格式的。
4. width, height:无边界时必须是2n,有边界时必须是2n+2
5. border:边界宽度,必须是0或者1。使用带边界的纹理对解决拼接时的缝隙是很有帮助的。不过OpenGL ES 1.0不支持
●OpenGL支持的纹理大小是非常有限的,你很可能要用多个纹理拼成一个很大图案,由于Linear之类的贴图算法需要将拼缝上的像素与相邻像素平均,将被切到下一个贴图上的像素放到边界里,可以保证获得的效果和整张图时是一样的。否则,可能会出现一条明显的拼缝。
6. format: 待上传的像素数据格式,GL_RGB等都可以故名思义的。同样,OpenGL ES 1.0 只支持最常用的RGB,RGBA,LUMINANCE_ALPHA,ALPHA。
7. type:待上传像素的数据类型。GL_UNSIGNED_BYTE表示纹理是一组8bit字节序列; GL_UNSIGNED_SHORT_5_6_5表示是16bit字序列,其中头5位记录Red分量,中6位记录Green分量,末5位记录Blue分量。
8. pixel:实际的纹理数据。

you might also like

  • 【连载】OpenGL_ES基础入门(四)-加载模型
  • 学习OpenGL ES之高级光照
  • 【连载】A​n​d​r​o​i​d​ ​O​p​e​n​G​L​ ​ES 3​D​基​础​教​程(一)
  • 【完结】OpenGL_ES基础入门(七)-压缩纹理、全屏抗锯齿 FSAA
  • 【连载】OpenGL_ES基础入门(六)-光照
  • 【连载】A​n​d​r​o​i​d​ ​O​p​e​n​G​L​ ​E​S​ ​3​D​基​础​教​程​二
  • PIC32学习连载之四:PIC32 DMA工作原理简析
  • 移动GPU小课堂连载(51~60)
  • OpenGL之使用颜色
  • 移动GPU小课堂连载(71~80)

  • (责任编辑:ioter)
    • 共3页:
    • 上一页
    • 1
    • 2
    • 3
    • 下一页

    (编辑:mao35  来源:网络整理)

    顶一下
    发表评论

    共有0位网友发表了评论 查看完整内容


    版权与免责声明:
    ①凡本网注明"来源:贸商网"的所有作品,版权均属于本网,转载请必须注明贸商网,违反者本网将追究相关法律责任。
    ②本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
    ③如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
    今日焦点
    企业动态

    网站服务:QQ:2632106543 广告洽谈:QQ:2632106543 Email:2632106543@qq.com All Right Reserved.   鲁ICP备16030072号-7

    版权所有 贸商网 Copyright ©2014-2024 mao35.com