JavaScript WebGL 基础疑惑点


引子
  • 顶点坐标范围为什么要在 -1.0 到 1.0 之间 ?
  • 多次缓冲数据是覆盖还是增量 ?
  • vertexAttribPointer 解析顶点一次就足够了 ?
  • useProgram 函数激活一次就足够了 ?
  • 基于的坐标系是什么 ?
  • 常见的变量类型有那些 ?
  • 内置的输入/输出变量有那些 ?
  • 参考资料
  • JavaScript WebGL 绘制一条直线 之后总算是熟悉了一点,但还是有些疑惑,在此集中记录一下。

    • Origin
    • My GitHub

    示例,最后只绘制了垂直直线:

      let vertices = [-0.5, 0, 0.0, 0.5, 0, 0.0]; // 水平直线
      let vertices2 = [0, 0.5, 0.0, 0, -0.5, 0.0]; // 垂直直线
      setBuffers(glContext, vertices);
      setBuffers(glContext, vertices2);
    

    vertexAttribPointer 每次都需要重新解析顶点,还是解析一次就足够了?

    在绘制直线示例的基础上尝试发现:

    1. 要先保证已缓冲了数据,该函数才能有效解析。
    2. 每次更新了缓冲,需要重新解析才能生效。

    enableVertexAttribArray 方法也是类似。

    useProgram 是否需要重新激活?

    在绘制直线示例的基础上尝试发现只需要激活一次,这是示例。

    WebGL 1.0 卡片索引。

    存储限定符

    • const : 编译时常量,或只读函数参数。
    • attribute : 用这个修饰的变量,表示是用于顶点着色器和 OpenGL ES 之间的链接。
    • varying : 用这个修饰的变量,表示是用于顶点着色器和片元着色器之间的链接。
    • uniform : 用这个修饰的变量,表示全局且唯一的变量,可以在任意阶段访问到,变量的值会一直保存。

    基本类型

    类型 含义
    void 没有返回值的函数或空参数列表
    bool 布尔值
    int 有符号整数
    float 浮点标量
    vec2, vec3, vec4 2/3/4 分量的浮点向量
    bvec2, bvec3, bvec4 2/3/4 分量的布尔向量
    ivec2, ivec3, ivec4 2/3/4 分量的有符号整数向量
    mat2, mat3, mat4 2x2, 3x3, 4x4 浮点数矩阵
    sampler2D 2D 纹理
    samplerCube 立体贴图纹理

    WebGL 1.0 卡片索引。

    顶点着色器特殊变量

    输入:

    变量 描述 单位或坐标系统
    highp vec4 gl_Position; 转换顶点位置 剪切坐标
    mediump float gl_PointSize; 变换点大小(仅点光栅化) 像素

    片元着色器特殊变量

    输入:

    变量 描述 单位或坐标系统
    mediump vec4 gl_FragCoord; 帧缓冲区内的片元位置 窗口坐标
    bool gl_FrontFacing; 片元属于前向基本体 布尔值
    mediump vec2 gl_PointCoord; 点内的片元位置(仅点光栅化) 每个组件从 0.0 到 1.0

    输出:

    变量 描述 单位或坐标系统
    mediump vec4 gl_FragColor; 片元颜色 RGBA 颜色
    mediump vec4 gl_FragData[n] 颜色附件n的片元颜色 RGBA 颜色
    Back to top

    WebGL lessons
  • 坐标系统