首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WEBGL将颜色更改为三角形

WEBGL将颜色更改为三角形
EN

Stack Overflow用户
提问于 2019-03-21 10:41:53
回答 1查看 1.8K关注 0票数 1

我被困在WEBGL的这一部分。很抱歉问这个问题,但是我在这个话题上很不在行,我昨天刚开始在页面上做一个教程。我构造了一个三角形,在尝试与他交互之后,用HTML菜单改变颜色。

这一切似乎都是可行的,但我用以下代码用vec4定义了我的颜色:

代码语言:javascript
复制
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)
  };

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

代码语言:javascript
复制
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);

问题在于,我看到vertexAttribPointer for vec4需要一个2,而不是1,但对于我来说,对于2给予glDrawArrays:尝试访问属性1中的范围外顶点

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

ObjectColor就是这样定义的。

代码语言:javascript
复制
var objectColor = colors['red'];

我的vec4来自

代码语言:javascript
复制
  <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,但我不明白如何详细检查。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-23 10:26:56

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

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

例如:

代码语言:javascript
复制
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):

代码语言:javascript
复制
gl.vertexAttribPointer(vColor, 4, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vColor);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55278603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档