WebGL编程指南 - 颜色与纹理续

设置纹理坐标(initVertexBuffers())

从缓冲区到 attribute 变量的流程:

javascript 复制代码
// 顶点坐标
function initVertexBuffers(gl) {
  // 数据准备
  let verticesTexCoords = new Float32Array([
    // 顶点坐标,纹理坐标
    -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,
  ])
  let n = 4
  // 创建缓冲区
  let vertexTexCoordBuffer = gl.createBuffer()
  if (!vertexTexCoordBuffer) {
    console.log('Failed to create vertexTexCoordBuffer')
    return -1
  }
  // 绑定缓冲区
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexTexCoordBuffer)
  // 缓冲区存储数据
  gl.bufferData(gl.ARRAY_BUFFER, verticesTexCoords, gl.STATIC_DRAW)

  // 顶点坐标相关配置
  let FSIZE = verticesTexCoords.BYTES_PER_ELEMENT
  ...

  // 纹理坐标相关配置
  let a_TexCoord = gl.getAttribLocation(gl.program, 'a_TexCoord')
  if (a_TexCoord < 0) {
    console.log('Failed to get the storage location of a_TexCoord')
    return -1
  }
  gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, FSIZE * 4, FSIZE * 2)
  gl.enableVertexAttribArray(a_TexCoord)
  
  ...
}

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

javascript 复制代码
// 初始化纹理
function initTextures(gl, n) {
  // 创建纹理对象
  let texture = gl.createTexture()
  if (!texture) {
    console.log('Failed to create texture')
    return
  }
  // 获取u_Sampler(纹理图像)的存储位置
  let u_Sampler = gl.getUniformLocation(gl.program, 'u_Sampler')
  if (!u_Sampler) {
    console.log('Failed to get the storage loaction of u_Sampler')
    return
  }
  // 创建一个image对象
  let image = new Image()
  // 注册图像加载事件的响应函数
  image.onload = function () {
    loadTexture(gl, n, texture, u_Sampler, image)
  }
  // 浏览器加载图像
  image.src = '../image/sky.jpg'

  return true
}

创建对象,获取地址,配置

gl.TEXTURE0 到 gl_TEXTURE7 是管理纹理图像的 8 个纹理单元,每一个都与 gl.TEXTURE_2D 相关联,而后者就是绑定纹理时的纹理目标

删除一个纹理对象

获取着色器中u_Sampler变量的地址

uniform 变量 u_Sampler 常被称为取样器,在示例中,该变量被用来接收纹理图像,所以我们需要获取它的地址用于后续配置

javascript 复制代码
  // 获取u_Sampler(纹理图像)的存储位置
  let u_Sampler = gl.getUniformLocation(gl.program, 'u_Sampler')
  if (!u_Sampler) {
    console.log('Failed to get the storage loaction of u_Sampler')
    return
  }

参考:【《WebGL编程指南》读书笔记-颜色与纹理】_webgl warning: texsubimage: texture has not been i-CSDN博客

相关推荐
zaizai100711 天前
WebGL编程指南 - 绘制和变换三角形
图形学
zaizai100712 天前
WebGL编程指南 - 入门续
图形学
闲人编程1 个月前
使用Python实现图形学的阴影贴图算法
python·算法·图形学·贴图·阴影贴图
闲人编程1 个月前
使用Python实现图形学的纹理映射算法
开发语言·python·算法·图形学·纹理映射
闲人编程1 个月前
使用Python实现图形学的环境映射算法
开发语言·python·算法·图形学·环境映射
闲人编程1 个月前
Python实现图形学曲线和曲面的Bezier曲线算法
开发语言·python·算法·图形学·曲线·曲面·bezier
CaptainHarryChen1 个月前
从 Affine Particle-In-Cell (APIC) 到 Material Point Method (MPM 物质点法)
图形学·物理仿真·mpm·仿真算法
Jozky862 个月前
图形学论文笔记
笔记·图形学
赵青青3 个月前
DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑
图形学