【发布时间】:2016-06-16 17:13:27
【问题描述】:
我正在学习 webgl,现在完全糊涂了。 我正在浏览this website,用代码编写的 cmets 为像我这样的初学者解释了。
例如:
var canvas = document.getElementById('canvas');
var gl = getWebGLContext(canvas);
if(!gl) {
return;
}
//Setup GLSL
var program = createProgramFromScripts(gl, ["2d-vertex-shader", "2d-fragment-shader"]);
gl.useProgram(program);
//Look up where the vertex data needs to go
var positionLocation = gl.getAttribLocation(program, 'a_position');
//create a buffer and put a single CLIPSPACE rectangle in it.
var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0,
1.0, -1.0,
-1.0, 1.0,
-1.0, 1.0,
1.0, -1.0,
1.0, 1.0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
//draw
gl.drawArrays(gl.TRIANGLES, 0, 6);
在上面的sn-p中,一行
var positionLocation = gl.getAttribLocation(program, 'a_position');
表示它得到了顶点需要去的位置,但我没有在顶点着色器中找到任何特定的东西
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0, 1);
}
我们怎么能说位置在哪里?
还有 Float32Array ,我们为什么要使用它,有没有我们可以实时使用它的场景,我完全对这些着色器感到困惑。
我还阅读了 GLSL Essentials 以获得一些着色器知识,但仍然对这些东西感到困惑。有人可以解释一下吗?
【问题讨论】:
-
是的,我已经在 SO 上发布了很多问题,您都非常认真地回答了所有问题,您愿意在线教我吗,如果是,您的报价是什么(您可以发邮件给我@subhasishdash60 @gmail.com,如果你愿意的话)?
-
好的,我现在明白了一件事。即我们应该使用 gl.drawArrays(gl.TRIANGLES, 0, SIZE_OF_FLOAT32ARRAY/2); .但现在我的疑问是 Float32Array 中的值代表什么,如果我更改值,我看不到任何变化?
-
此命令
gl.bufferData(...)复制Float32Array中的数据到 GPU。如果您编辑Float32Array中的值,则需要再次调用gl.bufferData(...)以将新值复制到 GPU。