WebGL编程指南(4)颜色与纹理

书本源代码 https://download.csdn.net/download/qfire/10371055

4.1 将非坐标数据传入顶点着色器

   点的尺寸

// MultiAttributeSize.js (c) 2012 matsuda
// Vertex shader program
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';

// Fragment shader program
var FSHADER_SOURCE =
  'void main() {\n' +
  '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
  '}\n';

function main() {
  // Retrieve <canvas> element
  var canvas = document.getElementById('webgl');
  // Get the rendering context for WebGL
  var gl = getWebGLContext(canvas);
  if (!gl) {
    console.log('Failed to get the rendering context for WebGL');
    return;
  }
  // Initialize shaders
  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
    console.log('Failed to intialize shaders.');
    return;
  }
  // Set the vertex information
  var n = initVertexBuffers(gl);
  if (n < 0) {
    console.log('Failed to set the positions of the vertices');
    return;
  }
  // Specify the color for clearing <canvas>
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  // Clear <canvas>
  gl.clear(gl.COLOR_BUFFER_BIT);
  // Draw three points
  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 sizes = new Float32Array([
    10.0, 20.0, 30.0  // Point sizes
  ]);
  // Create a buffer object
  var vertexBuffer = gl.createBuffer();  
  var sizeBuffer = gl.createBuffer();
  if (!vertexBuffer || !sizeBuffer) {
    console.log('Failed to create the buffer object');
    return -1;
  }
  // Write vertex coordinates to the buffer object and enable it
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
    if(a_Position < 0) {
    console.log('Failed to get the storage location of a_Position');
    return -1;
  }
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_Position);
  // Bind the point size buffer object to target
  gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.STATIC_DRAW);
  var a_PointSize = gl.getAttribLocation(gl.program, 'a_PointSize');
  if(a_PointSize < 0) {
    console.log('Failed to get the storage location of a_PointSize');
    return -1;
  }
  gl.vertexAttribPointer(a_PointSize, 1, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_PointSize);
  // Unbind the buffer object
  gl.bindBuffer(gl.ARRAY_BUFFER, null);
  return n;
}

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

   WebGL允许我们把顶点的坐标和尺寸数据打包到同一个缓冲区对象中,并通过某种机制分别访问缓冲区对象中不同种类的数据。


4.3 彩色三角形


一旦光栅化过程结束后,程序就开始逐片元调用片元着色器。片元着色器每调用一次,就处理一个片元。

光栅化是三维图形学的关键技术之一,它负责将矢量的几何图形转变为栅格化的片元(像素)。图形被转化为片元之后,我们就可以在片元着色器内做更多的事情,如为每个片元指定不同的颜色。颜色可以内插出来,也可以直接编程指定。

不同片元的颜色不同


4.4 在矩形表面贴上图像

   纹理映射将一张图像贴到一个几何图形的表面上去。这张图片又可以称为纹理图像。根据纹理图像,为之前光栅化后的每个片元涂上合适的颜色。组成纹理图像的像素又被称为纹素。

四步

  1. 准备好映射到几何图形上的纹理图像
  2. 为几何图形配置纹理映射方式
  3. 加载纹理图像,对其进行一些配置,以在WebGL中使用它
  4. 在片元着色器中将相应的纹素从纹理中抽取出来,并将纹素的颜色赋给片元。

纹理坐标是纹理图像上的坐标,通过纹理坐标可以在纹理图像上获取纹素颜色。WebGL系统中的纹理坐标系统是二维的,使用s和t命名纹理坐标。坐标值与图像自身的尺寸无关,不管是128x128还是128x156,其右上角的纹理坐标始终是(1.0, 1.0)


设置纹理坐标(initVertexBuffers())

    将纹理坐标传入顶点着色器,与将其他顶点数据相同

配置和加载纹理(initTextures())

激活纹理单元(gl.activeTexture()):WebGL至少支持8个纹理单元。



绑定纹理对象(gl.bindTexture())

配置纹理对象的参数(gl.texParameteri())


将纹理图像分配给纹理对象(gl.texImage2D())


将纹理单元传递给片元着色器(gl.uniform1i())

从顶点着色器向片元着色器传输纹理坐标:根据片元的纹理坐标,从纹理图像上抽取出纹素的颜色

在片元着色器中获取纹理像素颜色(texture2D())


纹理图像不足以覆盖整个矩形

4.5 使用多幅纹理

    最终的片元颜色由两个纹理上的纹素颜色共同决定



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《WebGL编程指南》是一本介绍WebGL技术的经典书籍,它详细阐述了WebGL的原理、应用和实践,是WebGL开发必备的参考书。本书附带的源代码是学习和实践WebGL的重要材料,它涵盖了WebGL的各个方面,从基础的三维图形绘制到高级的光影渲染和复杂的交互效果。 源代码包含了多个示例程序,各个示例程序围绕着一个主题展开。例如,有些示例程序演示了如何绘制简单的三维图形,如立方体和球体,还有些示例程序演示了如何添加纹理和材质,以及如何实现跨浏览器的兼容性。 此外,本书中的源代码还包括了一些高级的示例程序,如阴影、反射和抗锯齿等。这些示例程序可以帮助读者深入理解WebGL的工作原理和实现方法,并在实践中掌握WebGL技术。 值得一提的是,本书的源代码是经过精心设计和优化的,它压缩和合并了多个文件,以提高程序的性能和加载速度。因此,读者在使用本书源代码时,需要按照书中指导的步骤进行安装和部署,以获得最佳的开发体验。 总之,本书的源代码是WebGL学习和实践的重要资源,它提供了丰富的示例程序和实战经验,帮助读者快速掌握WebGL技术,开发出优秀的WebGL应用程序。 ### 回答2: WebGL编程指南是一本关于WebGL技术的教材,涵盖了从基础知识到高级应用的内容。其中提供了多个实例,结合源代码,帮助读者快速掌握WebGL编程技巧。 这本书的源代码非常有用,通过它可以理解WebGL的原理,并且快速搭建自己的WebGL应用程序。源代码中详细说明了各个组件的作用和用法,还提供了多种渲染器、着色器和纹理的实现方法,这些都对于初学者来说非常有价值。 WebGL编程指南源代码重点涵盖了三个方面:顶点缓冲对象、着色器和纹理。在顶点缓冲对象方面,它提供了多种创建和操作缓冲对象的实现方法,包括创建缓冲区、填充缓冲区、更新缓冲区等。在着色器方面,源代码中提供了包括简单着色器、光照着色器、Phong着色器在内的多种实现方法,这些着色器实现了不同的效果,读者可以根据需要自行选择。 最后是纹理,源代码提供了多种纹理类的实现方法,支持2D纹理、CubeMap纹理,以及多种纹理过滤和纹理映射方式。 总之,WebGL编程指南源代码提供了非常有价值的WebGL编程实践经验,对于从事WebGL开发的人员,特别是初学者,这是一份非常有意义的参考资料。 ### 回答3: 《WebGL编程指南》的源码是一本非常有用的资源,可以帮助读者更深入地理解WebGL编程技术。这本书的源码包括了许多有趣、实用的示例,可以帮助读者学会如何使用WebGL进行3D图形编程。 在掌握了基本的WebGL编程知识后,读者可以通过学习这些示例来深入了解WebGL技术,例如如何使用各种着色器、如何创建和渲染各种3D对象、如何进行照明和纹理映射等等。 同时,《WebGL编程指南》的源码也很容易上手。每个示例都有详细的注释和说明,使得读者可以很容易地理解代码的实现细节。读者可以将这些例子作为起点,自行修改和扩展,创造出更加有趣、独特的WebGL应用。 总之,《WebGL编程指南》的源码是非常有价值的,可以帮助广大编程爱好者、WebGL初学者甚至是资深的WebGL开发者,掌握更加深入的WebGL编程技术,为他们创造出更加精彩、创新的WebGL应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值