纹理

纹理的过程就是把选择片元着色器中使用指定颜色逐片元替换成指定图片逐片元。

准备纹理

创建纹理对象

var textureObj = render3D.texture(unit[, type]);

第一个参数表示创建的纹理单元是哪个,比如0表示0号纹理,必输;第二个是可选参数,表示纹理类型,默认选择为gl.TEXTURE_2D代表二维纹理。

配置纹理

textureObj.config({
    "TEXTURE_WRAP_S": "CLAMP_TO_EDGE"
    ...
});

可配置项有四个:

上面的例子配置了水平填充方法,有点类似css中设置背景图片的填充方法。返回textureObj。

链接资源图片

textureObj.use(level, format, textureType, image);

需要明白的是,到这一步为止,我们也只是把0号纹理和具体的图片联系起来了,具体使用的时候,还是看片元着色器。

删除纹理

textureObj.close();

删除纹理必须在使用结束后(相关绘图结束)。返回gl。

片元中使用纹理

precision mediump float;
varying vec2 v_textcoord;
void main(){
    gl_FragColor=texture2D(0, v_textcoord);
}

texture2D是GLES内置的方法,此处表示从0号(由第一个参数0指定)纹理获取v_textcoord指定的纹理坐标处的像素颜色。

v_textcoord是什么意思?就是webgl坐标对应的图片坐标,举个例子:

var data = new Float32Array([
    // 顶点坐标2,纹理坐标2
    -1.0, 0.707, 0.0, 0.0,
    -1.0, -0.707, 0.0, 1.0,
    1.0, 0.707, 1.0, 0.0,
    1.0, -0.707, 1.0, 1.0
]);

现在绘制一个矩形,四个点(顶点坐标)确定图形,这个矩形用图片(也就是纹理)填充颜色。

对于顶点(-1.0, 0.707)对应图片上的点(0.0, 0.0),四个点,就明确了所有点的对应方法。