返回顶部
首页 > 资讯 > 前端开发 > JavaScript >WebGL颜色与纹理使用介绍
  • 895
分享到

WebGL颜色与纹理使用介绍

WebGL颜色纹理WebGL纹理 2023-05-16 17:05:51 895人浏览 独家记忆
摘要

目录引言颜色三角形颜色纹理纹理坐标特别说明: 图片坐标解决方案纹理图像着色器设置引言 基于之前的知识,这里主要是 将顶点的其他数据--如颜色等-传入顶点着色器图元光栅化--在顶点着色

引言

基于之前的知识,这里主要是

  • 将顶点的其他数据--如颜色等-传入顶点着色器
  • 图元光栅化--在顶点着色器和片元着色器之间的从图形到片元的转化
  • 将纹理映射到图形或三维对象的表面上

颜色

三角形颜色

在之前的例子中,我们绘制了三角形的图形,并给它填充了颜色,如果想要颜色是渐变的,则可以把颜色和顶点类似在不同的顶点上设置不同的颜色向量值。

着色器中

const VSHADER_SOURCE = `
  attribute vec4 a_position;
  attribute vec4 aColor;
  varying vec4 vColor;
  void main(void){
    gl_Position=a_position;
    vColor = aColor;
  }
`
const FSHADER_SOURCE = `
  precision mediump float;
  varying vec4 vColor;
  void main() {
    gl_FraGColor = vColor;
  }
`

定义了aColor属性,这样可以再去设置不同顶点上对应的颜色值

let aPsotion = webGL.getAttribLocation(WEBgl.program, "a_position")
let arr = [
  -0.5, 0.5, 0.0,   1.0, 0.0, 0.0, 1.0, // 左上角,红色
  -0.5, -0.5, 0.0,  0.0, 1.0, 0.0, 1.0, // 左下角,绿色
  0.5, -0.5, 0.0,   0.0, 0.0, 1.0, 1.0, // 右下角,蓝色
]
let vertexArr = new Float32Array(arr)
let trangleBuffer = webgl.createBuffer()
webgl.bindBuffer(webgl.ARRAY_BUFFER, trangleBuffer)
webgl.bufferData(webgl.ARRAY_BUFFER, vertexArr, webgl.STATIC_DRAW)
webgl.enableVertexAttribArray(aPsotion)
webgl.vertexAttribPointer(aPsotion, 3, webgl.FLOAT, false, 7 * Float32Array.BYTES_PER_ELEMENT, 0)
const colorAttributeLocation = webgl.getAttribLocation(webgl.program, "aColor");
webgl.vertexAttribPointer(colorAttributeLocation, 4, webgl.FLOAT, false, 7 * Float32Array.BYTES_PER_ELEMENT, 3 * Float32Array.BYTES_PER_ELEMENT);
webgl.enableVertexAttribArray(colorAttributeLocation);

在这里有两个大的步骤

  • 图形装配过程:将顶点坐标构成几何图形
  • 光栅化过程:将图形转化成片元

在光栅化结束后,程序开始逐个的片元调用片元着色器, 那么在这三个点之间的颜色,WebGL系统用这3个顶点的颜色内插出来的,这个过程被称为内插过程

具体解析: 在顶点着色器中,三角形的3个顶点的颜色赋给varying变量v_Color,然后片元着色器中的varying变量v_Color就接收到了内插之后的片元颜色,在片元着色器中,我们把片元的颜色赋值给gl_FragColor变量,这样就绘制出了一个彩色的三角形。

纹理

什么是纹理?

可以形象的理解成某个物体的“皮肤”,而这个“皮肤”可以看成是一张图片,而这张图片中每一个点是一个片元(纹素),每个片元上涂上合适的颜色。

术语:贴图或是纹理映射

  • 准备好需要映射到物体上的纹理图像,例如PNGBMPDDSHDR
  • 给几何图形配置的纹理映射方式
  • 加载纹理图像,并进行配置,以在WebGL中使用
  • 在片元着色器中将相应的纹素从纹理中抽取出来,并将纹素中的颜色通过片元进行绘制

纹理坐标

纹理坐标是纹理图像上的坐标,通过纹理坐标可以在纹理图像上获取纹素颜色,WebGL系统中纹理坐标是二维的,简称st坐标系统

注意:纹理坐标和区域坐标的关系

const vertices = [
  // 顶点坐标           // 纹理坐标
  -0.5,  0.5, 0.0,     0.0, 1.0, // 左上角
   0.5,  0.5, 0.0,     1.0, 1.0, // 右上角
   0.5, -0.5, 0.0,     1.0, 0.0, // 右下角
  -0.5, -0.5, 0.0,     0.0, 0.0  // 左下角
];

这样你在脑海中就有一个概念了,顶点坐标和纹理坐标的关系映射。 当我们在区域内绘制了纹理图像,你会发现,这个图片和原来的图片是旋转了90°,这个又涉及到了一个概念:图片坐标

特别说明: 图片坐标

以左上角为原点,向右为x轴正方向,向下为y轴正方向。也就是说,对于一个像素点(x,y),x表示横坐标,y表示纵坐标,坐标轴的方向如下图所示:

(0,0)----------------> x
  |
  |
  |
  |
  v
  y

WebGL中的坐标向上为y轴正方向,所以导致图片是倒立的。

解决方案

先把解决办法给出来吧,两张方式,选取一种即可

  • 在图片的onload方法中:webgl.pixelStorei(webgl.UNPACK_FLIP_Y_WEBGL, 1)
  • 在片元着色器中gl_FragColor = texture2D(u_texture, vec2(v_texcoord.x, 1.0 - v_texcoord.y));

其目的都是对纹理图像进行Y轴(T轴)的反转

纹理图像

类似于蒙版效果

实现过程

  • 顶点着色器中点的坐标绘制区域
  • 纹理坐标用来装图片
  • 通过纹理映射texture2D将区域换上“皮肤”

着色器设置

const VSHADER_SOURCE = `
  attribute vec2 a_position;
  varying vec2 v_texcoord;
  void main() {
    gl_Position = vec4(a_position, 0.0, 1.0);
    v_texcoord = a_position * 0.5 + 0.5;
  }
`
const FSHADER_SOURCE = `
  precision mediump float;
  unifORM sampler2D u_texture;
  varying vec2 v_texcoord;
  void main() {
    gl_FragColor = texture2D(u_texture, vec2(v_texcoord.x, 1.0 - v_texcoord.y));
  }
`

着色器中使用sampler2D类型的变量来访问纹理数据

看看核心的方法

const texture = webgl.createTexture()
const image = new Image()
image.src = ''
texture.image = image
image.onload = function () {
  webgl.bindTexture(webgl.TEXTURE_2D, texture)
  webgl.texParameteri(
    webgl.TEXTURE_2D,
    webgl.TEXTURE_WRAP_S,
    webgl.CLAMP_TO_EDGE
  )
  webgl.texParameteri(
    webgl.TEXTURE_2D,
    webgl.TEXTURE_WRAP_T,
    webgl.CLAMP_TO_EDGE
  )
  webgl.texParameteri(
    webgl.TEXTURE_2D,
    webgl.TEXTURE_MIN_FILTER,
    webgl.LINEAR
  )
  webgl.texImage2D(
    webgl.TEXTURE_2D,
    0,
    webgl.RGBA,
    webgl.RGBA,
    webgl.UNSIGNED_BYTE,
    texture.image
  )
  const textureLoc = webgl.getUniformLocation(webgl.program, 'u_texture');
  webgl.uniform1i(textureLoc, 0);
  draw()
  webgl.drawArrays(webgl.TRIANGLE_STRIP, 0, 4);
}

texParameteri() 设置纹理图片的参数

参数:

  • TEXTURE_WRAP_TCLAMP_TO_EDGE: 设置纹理 S/T 轴方向上的边缘环绕方式为 CLAMP_TO_EDGE,即在超出边缘的部分使用纹理边缘的像素颜色填充.
  • TEXTURE_MIN_FILTER、LINEAR: 设置纹理的缩小过滤方式为 LINEAR,即当纹理需要被缩小时,使用线性过滤的方式得到缩小后的像素颜色值.

texImage2D 加载纹理图片

  • 第一个参数是纹理类型
  • 第二个参数是细节级别
  • 第三个参数是纹理格式
  • 第四个参数也是纹理格式
  • 第五个参数是纹理数据的类型
  • 最后一个参数是要加载的纹理图片

这里使用了 RGBA 格式,表示红、绿、蓝和透明度,使用 UNSIGNED_BYTE 数据类型,表示每个颜色分量使用一个字节存储

uniform1i()

  • location:表示要传递给哪个 uniform 变量的位置
  • value:表示要传递的整数值

注意哦! 这里的value可不能随便个整数

在WebGL中,纹理单元编号从0开始,最多可以使用16个纹理单元。因此,如果你想使用第一个纹理单元,就需要将value设置为0;如果你想使用第二个纹理单元,就需要将value设置为1

本想把多重纹理放在这一篇,但发现篇幅会很长,所以放在了下一篇,主要实现多个图片的叠加,当然是在纹理层面上的叠加了。

我们可以先看看效果

以上就是WebGL 颜色与纹理使用介绍的详细内容,更多关于WebGL 颜色纹理的资料请关注编程网其它相关文章!

--结束END--

本文标题: WebGL颜色与纹理使用介绍

本文链接: https://lsjlt.com/news/210348.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • WebGL颜色与纹理使用介绍
    目录引言颜色三角形颜色纹理纹理坐标特别说明: 图片坐标解决方案纹理图像着色器设置引言 基于之前的知识,这里主要是 将顶点的其他数据--如颜色等-传入顶点着色器图元光栅化--在顶点着色...
    99+
    2023-05-16
    WebGL 颜色纹理 WebGL 纹理
  • WebGL 多重纹理的使用介绍
    目录引言激活绑定配置分配传递效果代码着色器设置数据缓存区的设置纹理对象的初始化绘制和动态变化小结一下引言 基于上篇的内容,纹理中最小的单位是纹素,若干纹素组成一个纹理单元,每个纹理单...
    99+
    2023-05-16
    WebGL 多重纹理 WebGL 多重纹理
  • CSS中对RGB颜色的用法介绍
    这篇文章主要介绍“CSS中对RGB颜色的用法介绍”,在日常操作中,相信很多人在CSS中对RGB颜色的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS中对RGB颜色...
    99+
    2024-04-02
  • WebGL高级变换之Matrix4使用介绍
    目录引言gl-matrix简介示例--旋转矩阵变换WebGL按列矩阵gl-matrix 旋转矩阵复合变换效果放缩因子引言 上一篇结尾的说到了按列矩阵,但是如果是按照最原始的方式变换的...
    99+
    2023-05-16
    WebGL高级变换Matrix4 WebGL Matrix4
  • 如何使用HTML5 Canvas为图片填充颜色和纹理
    这篇文章将为大家详细讲解有关如何使用HTML5 Canvas为图片填充颜色和纹理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。填充颜色艺术离不开色彩,今天咱...
    99+
    2024-04-02
  • VueNextTick介绍与使用原理
    目录一、NextTick是什么定义理解为什么要有nexttick二、使用场景三、实现原理一、NextTick是什么 定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后...
    99+
    2022-11-13
    Vue NextTick Vue NextTick的作用
  • JavaScript闭包原理与使用介绍
    目录1. 认识闭包2. 变量的作用域和生命周期2.1 变量的作用域2.2 变量的生命周期3. 闭包的概念及其作用3.1 闭包的概念3.2 闭包的应用3.2.1 保存私有变量3.2.2...
    99+
    2022-11-13
    JavaScript闭包 JS闭包
  • Vuesnippets插件原理与使用介绍
    目录vue-snippetssnippets是什么vue-3-snippets插件支持的功能vue-snippets 随着开发者的年限的增加,不仅头发有点少,重复的代码也不断的增多,...
    99+
    2022-11-13
    Vue snippets原理 Vue snippets插件
  • JDBC的介绍与使用
    1. JDBC的介绍   jdbc为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。  访问数据库的流程  在连接这一过程中,一般初学者是MySQL和java在同一个电脑上,建立...
    99+
    2024-04-02
  • ResultSet的介绍与使用
    ResultSet是Java中用于表示数据库查询结果的对象,它可以对查询结果进行遍历和访问。一般来说,当使用JDBC进行数据库查询时...
    99+
    2023-09-11
    ResultSet
  • python gflags介绍与使用
    python gflags介绍与使用 1.升级python到2.6版本以上,否则安装setuptools会失败; 2.下载setuptools并安装,地址为:http://pypi.python.org/packages/2.6/...
    99+
    2023-01-31
    python gflags
  • 怎么在CSS3中使用颜色值RGBA与渐变色
    这篇文章给大家介绍怎么在CSS3中使用颜色值RGBA与渐变色,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。颜色值RGBA我们熟悉的rgb颜色标准,是由r(red)、g(green)、b(blue)三种颜色叠加变化形成各...
    99+
    2023-06-08
  • Swoole与HTTP的使用介绍
    这篇文章主要讲解了“Swoole与HTTP的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole与HTTP的使用介绍”吧!目标了解swoole的http_server的使用了解...
    99+
    2023-06-07
  • Python:jieba库的介绍与使用
    前言: jieba是优秀的中文分词第三方库,由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个词组,这种手段叫做分词,我们可以通过jieba库来完成这个过程。 目录: 一、jieba库基本介绍 (1)jieba...
    99+
    2023-09-22
    python
  • 【Python】pyinstaller的介绍与使用
    一、 概述 1、 简介 pyinstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可...
    99+
    2023-09-01
    python
  • VueMixins混入介绍与使用
    目录混入(Mixins)介绍Mixins使用1,建立js文件2,mixins.js代码3,页面局部混入全局混入混入(Mixins)介绍 混入 (mixin) 提供了一种非常灵活的方式...
    99+
    2023-02-02
    Vue Mixins混入 Vue Mixins
  • C++BoostArray与Unordered使用介绍
    目录一、提要二、示例boost::array三、Boost.Unordered一、提要 Boost.Array 库在 boost/array.hpp 中定义了类模板 boost::a...
    99+
    2022-11-13
    C++ Array与Unordered C++ Boost Array C++ Boost Unordered
  • Linux下Rsync的介绍与使用
    本篇内容介绍了“Linux下Rsync的介绍与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0.Rsync的介绍rsync是Linux系...
    99+
    2023-06-05
  • Mapstruct的具体介绍与使用
    我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得我的文章不错,记得一键三连哦 文章目录 一、mapstruct简介二、mapstruct与其他映射对比三、m...
    99+
    2023-09-03
    java
  • Pythoneval()与exec()函数使用介绍
    目录eval()和exec()的用法exec()和eval()的区别eval() 和 exec() 函数的应用场景eval() 和 exec() 函数都属于 Python 的内置函数...
    99+
    2023-01-29
    Python eval函数 Python exec函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作