【问题标题】:Can anybody explain these WebGL snippets?任何人都可以解释这些 WebGL 片段吗?
【发布时间】: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。

标签: glsl webgl


【解决方案1】:

Float32Array 包含将通过着色管道的所有顶点。 在您的顶点着色器中,您将 gl_Position 指定为一个 4 维向量,其中 x 和 y 属于您插入的顶点。因此 a_Position 包含您在数组中传递的值,并且顶点着色器将为那里的每个顶点运行。

所以这个着色器几乎没有任何作用。在实际应用中,您可以在此处进行多种变换和光照操作等。

如果您运行该程序,您应该会看到正在绘制的 2 个三角形(1 个矩形)。这是因为该数组包含 6 个分配给 2 个三角形的 2d 值。 查看更多关于 openGL 管道的信息here.

【讨论】:

  • 你似乎对 webgl 有很好的了解,你介意花点钱教我吗?
  • 对不起,我有一份全职工作和一个学位要攻读:/
  • 好的,我现在明白了一件事。即我们应该使用gl.drawArrays(gl.TRIANGLES, 0, SIZE_OF_FLOAT32ARRAY/2);。但现在我的疑问是 Float32Array 中的值代表什么,如果我更改值,我看不到任何变化?
  • 它们代表场景中的位置。如果您对它们进行了足够大的更改,您应该会看到变化。
  • 另外,如果我假设每 2 个顶点为 x 和 y ,我仍然无法理解为什么我只绘制一个三角形时会占用整个画布。 var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([100, -100, 150, 125, -175, 100]), gl.STATIC_DRAW); gl.enableVertexAttribArray(positionLocation); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); //draw gl.drawArrays(gl.TRIANGLES, 0, 3);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2011-08-25
  • 2019-12-29
相关资源
最近更新 更多