<!--
* @Author: 苹果园dog
* @Date: 2020-11-16 23:33:54
* @LastEditTime: 2020-11-17 10:27:58
* @LastEditors: Please set LastEditors
* @Description: 以下内容从webgl编程指南抄录
我们的目标是,将位置信息从JavaScript程序传给顶点着色器,有两种方式可以做到这点:attribute变量和uniform变量。
使用哪一个变量取决于需传输 的数据本身,attribute变量传输的是那些与顶点相关的数据,
而uniform变量传输的是那些对于所有顶点都相同(或与顶点无关)的数据。本例将使用attribute变量来传输
顶点坐标,显然不同的顶点通常具有不同的坐标。
attribute变量是一种GLSL ES变量,被用来从外部向顶点着色器内传输数据,只有顶点着色器能使用它。
为了使用attribute变量,示例程序需包含以下步骤:
1、在顶点着色器中,声明attribute变量;
2、将attribute变量赋值给gl_Position变量;
3、向attribute变量传输数据。
我们在js中指定一个点的坐标,然后在该坐标画了一个点。
* @FilePath: \web\webgl\study\helloPoint2.html
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body onload="main()">
<!--
如果不给 <canvas> 设置 widht、height 属性时,
则默认 width为300、height 为 150,单位是 px。
-->
<canvas id="webgl" width="400" height="400">
Please use a browser that supports "canvas"
</canvas>
<script src="../lib/webgl-utils.js"></script>
<script src="../lib/webgl-debug.js"></script>
<script src="../lib/cuon-utils.js"></script>
<script>
//顶点着色器
var VSHADER_SOURCE = `
attribute vec4 a_Position;
void main(){
gl_Position=a_Position;
gl_PointSize=15.0;
}
`;
//片元着色器
var FSHADER_SOURCE = `
void main(){
gl_FragColor=vec4(1.0, 0.0, 0.0, 1.0);
}
`;
function main() {
//获取<canvas>元素
var canvas = document.getElementById('webgl');
//获取WebGL上下文
var gl = getWebGLContext(canvas);
if (!gl) {
console.log('获取WebGL绘图上下文失败!');
return;
}
//初始化着色器
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('初始化着色器失败!');
return;
}
//获取attribute变量的存储位置
var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
if (a_Position < 0) {
console.log('获取a_Position变量的存储位置失败!');
return;
}
//将顶点位置传给attribute变量
gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);
//设置canvas背景色
gl.clearColor(0.0, 0.0, 0.0, 1.0);
//清除canvas
gl.clear(gl.COLOR_BUFFER_BIT);
//绘制一个点
gl.drawArrays(gl.POINTS, 0, 1);
/*
* attribute vec4 a_Position;
* 在这一行中,关键词attribute被称为存储限定符(storage qualifier),它表示接下来的变量是一个attribute变量,attribute变量必须声明
* 成全局变量,数据将从着色器外部传给该变量。变量的声明必须按照以下格式:
* <存储限定符><类型><变量名>
* attribute变量a_Position的类型是vec4。
* 我们使用辅助函数initShaders()在WebGL系统中建立了顶点着色器。
* 然后,WebGL就会对着色器进行解析,辨识出着色器具有的attribute变量,每个变量都具有一个存储地址,以便通过存储地址向变量传输数据。
* 比如,当你想要向顶点着色器的a_Position变量传输数据时,首先需要向WebGL系统请求该变量的存储地址。
* 我们使用gl.getAttribLocation()来获取attribute变量的地址。
* gl.vertexAttrib3f(a_Positon,0.0,0.0,0.0);
* 一旦将attribute变量的存储地址保存在js变量a_Position中,就需要使用该变量向着色器传入值
* 该函数的第一个参数是attribute变量的存储地址,第2,3,4个参数是三个浮点型数值,即x,y,z坐标值。函数被调用后,这三个值被一起传给
* 顶点着色器中的a_Position变量。
*/
}
</script>
</body>
</html>