HTML5技术

WebGL笔记(七):贴图(笔记终结) - jerrylsxu

字号+ 作者:H5之家 来源:博客园 2016-05-26 15:01 我要评论( )

上篇提到过关于贴图的两个限制: 1、跨域安全限制 跟AJAX之类差不多,但是没有测试根目录下具有安全配置文件(一些xml)的情况。当然,不出意外,本地浏览(file协议)调用相对路径图片也是不可以的。所以,连测试只能在一个web平台下进行。 2、图片格式问题 M

上篇提到过关于贴图的两个限制:

1、跨域安全限制

跟AJAX之类差不多,但是没有测试根目录下具有安全配置文件(一些xml)的情况。当然,不出意外,本地浏览(file协议)调用相对路径图片也是不可以的。所以,连测试只能在一个web平台下进行。

2、图片格式问题

MDN上有个提示:

https://developer.mozilla.org/en/WebGL/Using_textures_in_WebGL

Note: Textures' widths and heights must be a power of two number of pixels (that is, 1, 2, 4, 8, 16, etc).

我理解为:图片的宽度和高度只能为2^n(n=0|自然数),单位为像素(px)。但限制还远不止此。测试通过的图片格式情况:

JPG格式不知什么原因,竟然没有通过;需要注意,颜色位数似乎也应该是2^n,24位也未通过;然而虽然8位的gif可以使用,但是8位的png却不能。tag/tiff不支持。PNG透明不支持,GIF的透明支持。

ff32

上图是MDN例子里的原图,请下载后看属性里的详细信息。

MDN关于贴图的例子:https://developer.mozilla.org/samples/webgl/sample6/index.html

本例做了较大的修改,并增加了灯光效果。注意,原例中没有灯光变化。

image

 

我们首先修改Shader

<script id="shader-vs" type="x-shader/x-vertex"> attribute highp vec3 aVertexNormal; attribute highp vec3 aVertexPosition; attribute highp vec2 aTextureCoord; uniform highp mat4 uNormalMatrix; uniform highp mat4 uMVMatrix; uniform highp mat4 uPMatrix; varying highp vec2 vTextureCoord; varying highp vec3 vLighting; void main(void) { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = aTextureCoord.st; highp vec3 ambientLight = vec3(0.6, 0.6, 0.6); highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75); highp vec3 directionalVector = vec3(0.85, 0.8, 0.75); highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0); highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0); vLighting = ambientLight + (directionalLightColor * directional); } </script>   <script id="shader-fs" type="x-shader/x-fragment"> varying highp vec2 vTextureCoord; varying highp vec3 vLighting; uniform sampler2D uSampler; void main(void) { highp vec2 texCoord = vec2(vTextureCoord.s, vTextureCoord.t); highp vec4 color = texture2D(uSampler, texCoord); gl_FragColor = vec4(color.rgb * vLighting, color.a); } </script>

 

一些代码:

var igl = new iWebGL('glcanvas', 0);   /* 立方体顶点和三角面顶点索引顺序 */ var vs = CubeVertices(); igl.paramVertices('aVertexPosition').define(vs.data); igl.paramVerticesIndex().define(vs.indices); /* 顶点贴图数据 */ igl.paramVertices('aVertexNormal').define([ // Front 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Back 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, // Top 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Bottom 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // Right 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Left -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0 ]); igl.paramTexture('aTextureCoord').define([ // Front 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Back 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Top 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Bottom 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Right 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Left 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ]); /* 调用贴图 */ igl.loadTexture2('ff32.png'); /* 设置场景 */ igl.matrix.trans([0.0, 0.0, -5.0]); igl.matrix.make(40, 640 / 480, 0.1, 100.0); var animate = function(){ igl.matrix.rotate(1, [1, 0, 1]); igl.drawCube();; } /* 动画效果 */ setInterval(animate, 40);

 

image

我觉得效果还不错的。

Ops…忘了链接:

WebGL-Step-07pro.html

ff32.png

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • PixiJS - 基于 WebGL 的超快 HTML5 2D 渲染引擎 - 梦想天空(山边小溪)

    PixiJS - 基于 WebGL 的超快 HTML5 2D 渲染引擎 - 梦想天空(山边小

    2017-04-12 08:02

  • h5笔记 - 伟丶那个哥

    h5笔记 - 伟丶那个哥

    2017-04-08 14:02

  • HTML5学习笔记 - 小僵尸

    HTML5学习笔记 - 小僵尸

    2017-03-22 12:00

  • HTML5学习笔记一: 认识H5 - 南心芭比

    HTML5学习笔记一: 认识H5 - 南心芭比

    2017-03-16 12:00

网友点评
.