WebGL入门 颜色与纹理

第五章 颜色与纹理

  1. gl.vertexAttribPointer()的步进和偏移参数

var VSHADER_SOURCE =

'attribute vec4 a_Position;\n' +

'attribute float a_PointSize;\n' +

'void main() {\n' +

'  gl_Position = a_Position;\n' +

'  gl_PointSize = a_PointSize;\n' +

'}\n';


var vertices = new Float32Array([

0.0, 0.5,  -0.5, -0.5,  0.5, -0.5

]);

var n = 3;

var sizes = new Float32Array([

10.0, 20.0, 30.0  // Point sizes

]);

var vertexBuffer = gl.createBuffer();

var sizeBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

var a_Position = gl.getAttribLocation(gl.program, 'a_Position');

gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

gl.enableVertexAttribArray(a_Position);

gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);

gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.STATIC_DRAW);

var a_PointSize = gl.getAttribLocation(gl.program, 'a_PointSize');

gl.vertexAttribPointer(a_PointSize, 1, gl.FLOAT, false, 0, 0);

gl.enableVertexAttribArray(a_PointSize);

2.varying变量


var VSHADER_SOURCE =

'attribute vec4 a_Position;\n' +

'attribute vec4 a_Color;\n' +

'varying vec4 v_Color;\n' +

'void main() {\n' +

'  gl_Position = a_Position;\n' +

'  gl_PointSize = 10.0;\n' +

'  v_Color = a_Color;\n' +

'}\n';

var FSHADER_SOURCE =

'precision mediump float;\n' +

'varying vec4 v_Color;\n' +

'void main() {\n' +

'  gl_FragColor = v_Color;\n' +

'}\n';


var verticesColors = new Float32Array([

// Vertex coordinates and color 顶点坐标和颜色

0.0,  0.5,  1.0,  0.0,  0.0,  //一个顶点信息

-0.5, -0.5,  0.0,  1.0,  0.0,

0.5, -0.5,  0.0,  0.0,  1.0,

]);

var vertexColorBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, vertexColorBuffer);

gl.bufferData(gl.ARRAY_BUFFER, verticesColors, gl.STATIC_DRAW);

var FSIZE = verticesColors.BYTES_PER_ELEMENT;

var a_Position = gl.getAttribLocation(gl.program, 'a_Position');

/*

2 :指定了每个顶点的分量个数(x,y),

FSIZE*5 :指定了相邻两个顶点之间的字节数

0 :指定了偏移量

*/

gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE * 5, 0);

gl.enableVertexAttribArray(a_Position);

/*

3 :指定了每个顶点的所需颜色的分量数(R,G,B),

FSIZE*5 :指定了相邻两个顶点之间的字节数

FSIZE*2 :指定了偏移量,每个顶点信息的前两个是顶点坐标信息

*/

var a_Color = gl.getAttribLocation(gl.program, 'a_Color');

gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE * 5, FSIZE * 2);

gl.enableVertexAttribArray(a_Color);

/*

GL_ES语句中,顶点着色器中定义了a_color和v_color,并将a_color的值赋值给了v_color,然后在片元着色器中定义了v_color

并将v_color的值赋值给FragColor,由于两个着色器中的两个v_color指向了同一个空间,所以在上面的程序中将顶点颜色信息

传递给a_color,a_color会将该颜色信息传递个v_color,而v_color会将颜色信息传递给FragColor,实现了对颜色的修改

*/

3.图形的绘制

  • 确定顶点坐标

  • 图形装配

  • 光栅化

  • 执行片元着色器

4.在矩形表面贴上图像


var VSHADER_SOURCE=

'attribute vec4 a_Position;\n'+

'attribute vec2 a_TexCoord;\n'+

'varying vec2 v_TexCoord;\n'+

'void main(){\n'+

'gl_Position = a_Position;\n'+

'v_TexCoord=a_TexCoord;\n'+

'}\n';

var FSHADER_SOURCE=

'precision mediump float;\n'+

'uniform sampler2D u_Sampler;\n'+

'varying vec2 v_TexCoord;\n'+

'void main(){\n'+

// u_Sampler中存放着取色器的各种信息:纹理图像,填充方式

// v_TexCoord中存放着纹理坐标,告诉取色器从哪里选取纹理

'gl_FragColor=texture2D(u_Sampler,v_TexCoord);\n'+

'}\n';


//将顶点坐标和纹理坐标分别赋值给GL_ES语句中的a_Position和a_TexCoord

function initVertexBuffers(gl){

// 顶点和纹理坐标数组

var verticesTexCoords=new Float32Array([

// -0.5,0.5是webgl系统坐标系,0.0,1.0是webgl纹理坐标系系统

-0.5,0.5,0.0,1.0,

-0.5,-0.5,0.0,0.0,

0.5,0.5,1.0,1.0,

0.5,-0.5,1.0,0.0,

]);

.......

}


function initTextures(gl,n){

// 创建纹理对象

var texture = gl.createTexture();

// 该变量用来接收纹理图像

var u_Sampler=gl.getUniformLocation(gl.program,'u_Sampler');

var image=new Image();

image.onload = function(){loadTexture(gl,n,texture,u_Sampler,image);};

image.src='sky.JPG';

return true;

}

function loadTexture(gl,n,texture,u_Sampler,image){

// 对纹理图像进行y轴反转,读到的图像是图像坐标系,它和webgl纹理坐标系系统的y轴方向相反

gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);

// 开启0号纹理单元

gl.activeTexture(gl.TEXTURE0);

// 应该是绑定0号纹理单元和纹理对象(每个纹理单元都已经和TEXTURE_2D关联了)

// 在WebGL中,无法直接操作纹理对象,必须通过将纹理对象绑定到纹理单元,然后通过操作纹理单元来间接操作纹理对象

gl.bindTexture(gl.TEXTURE_2D,texture);

// 配置纹理参数 如何根据纹理坐标来获取纹素颜色、按哪种方式重复填充纹理

/* 参数2 pname:设置填充方法

gl.TEXTURE_MAG_FILTER 放大填充方法,将纹理图像映射到更大的空间上

gl.TEXTURE_MIN_FILTER 缩小填充方法,将纹理图像映射到更小的空间上

gl.TEXTURE_WRAP_S 水平填充方法

gl.TEXTURE_WRAP_T 垂直填充方法

参数3 param:为pname制定的方法指定更具体的填充方法

放大缩小方法可选参数:gl.NEAREST  gl.LINEAR

gl.NEAREST:使用原纹理上距离映射后像素(新像素)中心最近(曼哈顿距离)的那个像素的颜色值作为新值

默认值 gl.LINEAR:使用距离新像素中心最近的四个像素的颜色值得加权平均值作为新值

水平填充和垂直填充方法可选参数:gl.REPEAT  gl.MIRRORED_REPEAT gl.CLAMP_TO_EDGE

默认值 gl.REPEAT 平铺式的重复纹理

gl.MIRRORED_REPEAT 镜像对称式的重复纹理

gl.CLAMP_TO_EDGE 使用纹理图像边缘值

*/

gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);

// 将纹理图像分配给纹理对象,将image指定的图像分配给绑定到纹理目标上的纹理对象

gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);

//gl.uniform1i的第二个参数为0表示的是纹理单元的编号,

gl.uniform1i(u_Sampler,0);

gl.clear(gl.COLOR_BUFFER_BIT);

gl.drawArrays(gl.TRIANGLE_STRIP,0,n);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容