• webgl glsl


     GLSL是什么?

    1. GLSL是运行在GPU上的着色器语言

    2. GLSL有自己的语法,跟js有些不同.

    GLSL是一个强类型的语言,所以在写着器语言时,必须要用强类型,强类型,强类型,强类型

    GLSL是着色器语言, WebGL的全部内容就是创建不同的着色器,向着色器提供数据然后调用gl.drawArrays 或 gl.drawElements 让WebGL调用当前顶点着色器处理每个顶点,

    GLSL不存在传统意义上的变量,但有缓存,可以把缓存当变量,  先创建缓存,然后绑定绑存,然后就可以操作缓存了

    下面通过一些问量来一步一步的分析.

    let positionBuffer = gl.createBuffer();

    返回了一个变量,能直接操作它吗?

    console.log(positionBuffer)会报错.不能直接用,因为缓存是gpu上的.

    怎么用呢?

    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);

    gl.bufferData(gl.ARRAY_BUFFER, new TypeArray()); TypeArray是举例,用强类型数组

    注:bindBuffer时,不能随便绑定,这些都是枚举值,有含义的。

    gl.ARRAY_BUFFER一般用于顶点数据,

    gl.ELEMENT_ARRAY_BUFFER一般用于索引数据

    数存的数据是绑定了,但是着色器语言中有很多变量的,这些变量是数据的.

    gl.vertexAttribPointer(postion, size, type, normalize, stride, offset);

    当然这只是顶点数据,还有全局数据,全局数据是程序提供的,此处省略

    给着色器里的变量提供数据后,就可开始画三角形了,为什么画三角形, 不解释。

    这样一步一步来,也就初步的理解了glsl.

      下面提供下上传数据的三部曲,第一步中location是不会变的,一般在初始化着色器语言的时候进行

      1)gl.enableVertexAttribArray(colorLocation);               // 告诉glsl,我们想为该属性提供数据

      2)gl.bindBuffer(glARRAY_BUFFER, colorBuffer);     // 这个命令是将缓冲绑定到 ARRAY_BUFFER 绑定点,它是WebGL内部的一个全局变量。

      // 告诉颜色属性如何从colorBuffer中提取数据 (ARRAY_BUFFER)
      var size = 4;                 // 每次迭代使用四个单位数据
      var type = gl.UNSIGNED_BYTE;  // 数据类型是8位的 UNSIGNED_BYTE 类型。
      var normalize = true;         // 标准化数据
      var stride = 0;               // 0 = 移动距离 * 单位距离长度sizeof(type) 
      var offset = 0;               // 从缓冲的起始处开始
      3)gl.vertexAttribPointer(
          colorLocation, size, type, normalize, stride, offset)

      这个命令告诉WebGL从 ARRAY_BUFFER 绑定点当前绑定的缓冲获取数据。 每个顶点有几个单位的数据(1 - 4),单位数据类型是什么(BYTEFLOATINTUNSIGNED_SHORT, 等等...)

          stride 是从一个数据到下一个数据要跳过多少位,

          offset 是数据在缓冲的什么位置。

      单位个数永远是 1 到 4 之间。

      如果每个类型的数据都用一个缓冲存储,stride 和 offset 都是 0 。 对 stride 来说 0 表示 “用符合单位类型和单位个数的大小”。 对 offset 来说 0 表示从缓冲起始位置开始读取。

           它们使用 0 以外的值时会复杂得多,虽然这样会取得一些性能能上的优势, 但是一般情况下并不值得,除非你想充分压榨WebGL的性能。

      

  • 相关阅读:
    一次有教益的程序崩溃调试 (中)
    读书:手工测试与自动测试
    迭代还是交付?
    用Windbg调试.NET程序的资源泄漏
    一次有教益的程序崩溃调试 (上)
    基于云计算的软件测试服务
    Vcastr 3.0 api
    学习Linux三(Linux常用命令及技巧)
    学习Linux六(Linux必学60个命令之【文件处理】)
    学习Linux四(Linux必学60个命令)
  • 原文地址:https://www.cnblogs.com/honghong87/p/9676135.html
Copyright © 2020-2023  润新知