《WebGL编程指南》学习——绘制和变换三角形

《WebGL编程指南》的第三章用了两天看完,现将看完之后的总结和心得写下来!
  • 三维模型的基本组成部分就是三角形。
一、绘制多个点
WebGL提供了 缓冲区对象(Buffer Object),可以一次性的向缓冲区内传入多个顶点数据。例如下面在同时绘制三个点的时候,就用到了缓冲区对象。
function main()
{   
      //设置顶点位置
      var n = initVertexBuffers(gl);
      。。。
      //绘制多个点
      gl.drawArrays(gl.POINTS, 0, n);
}

function initVertexBuffers(gl)
{
      var vertices = new Float32Array([
            0.0, 0.5, -0.5, -0.5, 0.5, -0.5
      ])
     var n = 3;//设置点的个数
}

var vertexBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);//将缓冲区绑定到目标
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);//向缓冲区对象中写入数据
gl.vertexAttribPointer(Points, 2, gl.FLOAT, false, 0, 0);//将缓冲区对象分配给Points变量
gl.enableVertexAttribArray(Points);//连接Points变量与分配给他的缓冲区对象

 

缓冲区对象是WebGL系统中的存储区,在存储区中保存着想要使用的顶点数据。使用缓冲区的句提步骤如下:
创建缓冲区》》绑定缓冲区对象》》将数据写入缓冲区》》将缓冲区对象分配给一个attribute变量》》启用attribute变量。
一、移动、旋转、缩放
  • 移动
为了将目标移动,只需要在顶点着色器中为顶点坐标的每个分量都加上需要移动的数值即可。
首先在顶点着色器中添加相应代码:
   'uniform vec4 u_Translation;\n' +
   'void main() {\n' +
   '   gl_Position = a_Position + u_Translation;\n' +
........
//将移动距离传递给顶点着色器
var u_Translation = gl.getUniformLocation(gl.program, 'u_Translation');
gl.uniform4f(u_Translation, x, y, z, 0.0);
  •     旋转
旋转稍微复杂,需要自己进行空间关系的计算,之后在程序里写出来,这里只给出代码:
   '   uniform float u_CosB, u_SinB;\n' +
   'void main() {\n' +
   '   gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;\n' +
   '   gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;\n' +
   '   gl_Position.z = a_Position.z;\n' +
   '   gl_Position.w = 1.0;\n' +
   '}\n';//顶点着色器中进行计算与赋值
//将旋转需要的数据传递给顶点着色器
   var radian = Math.PI * ANGLE / 180.0; // Convert to radians
   var cosB = Math.cos(radian);
   var sinB = Math.sin(radian);
   var u_CosB = gl.getUniformLocation(gl.program, 'u_CosB');
   var u_SinB = gl.getUniformLocation(gl.program, 'u_SinB');
   if (!u_CosB || !u_SinB) {
      console.log('Failed to get the storage location of u_CosB or u_SinB');
      return;
   }
   gl.uniform1f(u_CosB, cosB);
   gl.uniform1f(u_SinB, sinB);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值