美文网首页
webgl 4.画一个点2

webgl 4.画一个点2

作者: lesliefang | 来源:发表于2017-08-25 14:02 被阅读41次

上节我们画了一个点,不过点的位置和大小都是写死的,这节我们看看怎么传递数据到 shader 中。

// vertex shader
 var VERTEX_SHADER_SOURCE =
   'attribute vec4 a_Position;\n' +
   'uniform float u_PointSize;\n' +
   'void main() {\n' +
   '   gl_Position = a_Position;\n' +
   '   gl_PointSize = u_PointSize;\n' +
   '}\n';

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

有 2 种方式可传值到 shader 中,通过 attribute(属性) variable 或者 uniform variable。 attribute 用来传递可变数据,uniform 用来传递常量。我们定义了 a_Position 来接收顶点信息,由于我们希望每个顶点的大小都一样,所以定义了 u_PointSize 为 uniform 变量。

var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);

var u_PointSize = gl.getUniformLocation(gl.program, 'u_PointSize');
gl.uniform1f(u_PointSize, 5.0);   
  • gl.getAttribLocation(program, name)

用来获得 attribute 变量的地址(可理解为内存地址或指针)
第一个参数是 program 对象, 第二个参数是 变量名

  • gl.getUniformLocation(program, name)

用来获得 uniform 变量的地址
同上第一个参数是 program 对象, 第二个参数是 变量名

  • gl.vertexAttrib3f(location, v0, v1, v2)

给 attribute 变量赋值,f 表示 float
第一个参数是变量地址,后面是值

gl.vertexAttrib*f 是一系列方法

gl.vertexAttrib1f(location, v0) 
gl.vertexAttrib2f(location, v0, v1) 
gl.vertexAttrib3f(location, v0, v1, v2) 
gl.vertexAttrib4f(location, v0, v1, v2, v3)

分别对应 float, vec2, vec3, vec4 类型
我们的 a_Position 是 vec4 类型的,但我们只传了 3 个值,因为第4个值 w 默认为 1.0, 前 3 个值默认为 0

  • gl.uniform1f(location, v0)

给 uniform 变量赋值

同理 gl.uniform*f 也是一系列方法

gl.uniform1f(location, v0) 
gl.uniform2f(location, v0, v1) 
gl.uniform3f(location, v0, v1, v2) 
gl.uniform4f(location, v0, v1, v2, v3)

attribute 变量只能定义在 vertex shader 中,uniform 变量既可以定义在 vertex shader 中也可以定义在 fragment shader 中。

练习:
现在点的颜色是在 shader 中写死的, 尝试从 JS 中传一个值进去。

查看源码

相关文章

  • webgl 4.画一个点2

    上节我们画了一个点,不过点的位置和大小都是写死的,这节我们看看怎么传递数据到 shader 中。 有 2 种方式可...

  • WebGL(画一个点)

    什么是WebGL WebGL使得在支持HTML的canvas标签的浏览器中,不需要安装任何插件,便可以使用基于Op...

  • webgl 3.画一个点

    对于初学者来说 initShaders 的具体实现可以先忽略,这个方法主要是编译链接 shader 的。仔细读一遍...

  • 30天学画画~第一天,球

    1.画一个圆。 2.找光源。 3.画投影。 4.阴影。调和。

  • webgl基础图形

    WebGL的工作是绘制图形图像,了解WebGL的图形是至关重要的。 一、点 在WebGL中点是一个正方形,用一个三...

  • WebGL 的 Hello World

    本文整理自 div 侠于 凹凸 2022 年技术分享,简单介绍了 WebGL 画一个基础图形的流程,希望你了解之后...

  • webgl 9.画一个圆

    前面我们学习了复杂的物体都可以由多个三角形组成。所以可以用多个三角形去拟合一个圆形。 如图我们可以把圆等分成 N ...

  • webgl 8.画一个正方形

    前面我们说 webgl 只能画点、线、三角形 3 种基本图形,那么我想画一个球,画一个宇宙飞船怎么办呢?图形学中复...

  • iOS CAAnimationGroup

    1.画一个❤️图案 2.缩放 3.旋转 4.位移 5.添加到一个CAAnimationGroup

  • 成功日志 第2天

    1.长投课程参与晨读分享 2.晚上六点半起床 3.完成写作2篇2000字 4.画一幅禅绕画 5.睡了一个午觉 6....

网友评论

      本文标题:webgl 4.画一个点2

      本文链接:https://www.haomeiwen.com/subject/ypyudxtx.html