【问题标题】:WEBGL change color to triangleWEBGL 将颜色更改为三角形
【发布时间】:2019-03-23 19:04:58
【问题描述】:

我被困在 WEBGL 的这一部分。 很抱歉这个问题,但我对这个话题很敏感,我昨天才开始在页面上做一个教程。 我构建了一个三角形,在尝试与他互动后,使用 HTML 菜单更改颜色。

似乎一切正常,但我使用 vec4 使用以下代码定义我的颜色:

var colors = {
    'red': new vec4(1, 0, 0, 1),
    'blue': new vec4(0, 0, 1, 1),
    'green': new vec4(0, 1, 0, 1),
    'yellow': new vec4(1, 1, 0, 1),
    'cyan': new vec4(0, 1, 1, 1),
    'magenta': new vec4(1, 0, 1, 1)
  };

在缓冲区部分我做了这个:

gl.clear(gl.COLOR_BUFFER_BIT);


  var program = initShaders(gl, "vertex-shader", "fragment-shader");
  gl.useProgram(program);
    // The colour array is copied into another
    var color_buffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
    gl.bufferData(gl.ARRAY_BUFFER, flatten(objectColor), gl.STATIC_DRAW);

    //Here we prepare the "vColor" shader attribute entry point to
    //receive RGB float colours from the colour buffer
    var vColor = gl.getAttribLocation(program, "vColor");
    gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
    gl.vertexAttribPointer(vColor, 1, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(vColor);

问题出在这里,我看到 vec4 的 vertexAttribPointer 需要 2,而不是 1,但对我来说 2 给出 glDrawArrays:尝试访问属性 1 中超出范围的顶点

顺便说一句,如果我使用 1 程序只改变三角形中的一个顶点,在这种情况下,使用红色 vec4(1, 0, 0, 1) 三角形的第一个点将是红色的,而其他顶点将是黑色,所以我认为最后 1 个将被忽略。

ObjectColor就是这样定义的。

var objectColor = colors['red'];

我的 vec4 将来自

  <script id="vertex-shader" type="x-shader/x-vertex">

        attribute vec4 vPosition;
        attribute vec4 vColor;

        varying vec4 varColor;


        void main()
        {

            gl_Position = vPosition;
            varColor = vColor;

        }
    </script>

    <script id="fragment-shader" type="x-shader/x-fragment">


        precision mediump float;
        varying vec4 varColor;

        void main()
        {

            gl_FragColor = varColor;

        }

我该如何解决这个问题?我哪里错了?

我正在尝试关注这个Passing color to fragment shader from javascript 但我不明白如何详细检查。

【问题讨论】:

  • 您需要发布更多代码。不知道vec4 i 来自您未显示的某个库,objectColor 也未显示。您通常需要每个顶点的颜色。换句话说,如果三角形有 3 个顶点,则需要 3 种颜色,每个顶点一种颜色,即使它们的值都相同。我建议these tutorials,尤其是this one
  • 我将编辑问题@gman
  • 所以我已经看到了这个例子,我从 webglfundamentals 开始学习,但是在这种情况下颜色会改变基础位置。我在 html 中使用一个菜单,将颜色传递给 js 和颜色将被应用@gman
  • 该页面中有 3 或 4 个示例。底部的颜色不变

标签: javascript colors webgl


【解决方案1】:

颜色缓冲区必须包含每个顶点坐标 1 种颜色。如果要绘制单一颜色的三角形,则颜色缓冲区必须包含 3 次相同的颜色。

每种颜色有 4 个分量 (RGBA),因此缓冲区必须有 12 个元素:

例如

color = [1, 0, 0, 1];
colorAttributes = [];
for(let i = 0; i < 3; ++i)
    colorAttributes.push(...color);

var color_buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colorAttributes), gl.STATIC_DRAW);

gl.vertexAttribPointer 的第二个参数(元组大小)必须为 4,因为颜色属性有 4 个分量,即 4 个颜色通道(RGBA):

gl.vertexAttribPointer(vColor, 4, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vColor);

【讨论】:

  • 感谢您的回答。我使用 uniform 和 vec4 以其他方式进行编辑,并且我还为每个矢量使用树颜色制作了其他版本并且工作相同!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2014-04-29
相关资源
最近更新 更多