0

在构建着色器时,我注意到有时会使用一个名为 main 的 void 函数来定义着色器。当一个属性被迭代时,它似乎main被添加到着色器中。

我想弄清楚何时适合在内部定义着色器main,而不是仅在着色器的顶级定义空间内。

regl 教程中的示例代码。

var drawTriangle = regl({
  //
  // First we define a vertex shader.  This is a program which tells the GPU
  // where to draw the vertices.
  //
  vert: `
    // This is a simple vertex shader that just passes the position through
    attribute vec2 position;
    void main () {
      gl_Position = vec4(position, 0, 1);
    }
  `,

  //
  // Next, we define a fragment shader to tell the GPU what color to draw.
  //
  frag: `
    // This is program just colors the triangle white
    void main () {
      gl_FragColor = vec4(1, 1, 1, 1);
    }
  `,

  // Finally we need to give the vertices to the GPU
  attributes: {
    position: [
      [1, 0],
      [0, 1],
      [-1, -1]
    ]
  },

  // And also tell it how many vertices to draw
  count: 3
})
4

1 回答 1

1

我不熟悉 regl,但main()GLSL 着色器总是需要一个函数。它是着色器的入口点。例如,在顶点着色器的情况下,着色器的main()函数将为每个顶点执行。在您的教程代码中,gl_Position是顶点着色器的内置(与用户定义相反)输出。attribute vec2 position;为顶点着色器定义一个输入变量,它可以访问该position属性。

于 2018-06-12T19:37:02.877 回答