WebGl LINE_STRIP宽度

时间:2015-01-18 12:37:36

标签: javascript webgl vbo

我正在绘制一个充满顶点的vbo,如下所示:[x,y,r,g,b,...] 使用渲染模式:LINE_STRIP。

我使用以下函数为我的vbo添加一个值:

this.gameBuffer.vertices[this.gameBuffer.vertices.count * this.gameBuffer.vertices.step + 0] = circle.x;
  this.gameBuffer.vertices[this.gameBuffer.vertices.count * this.gameBuffer.vertices.step + 1] = circle.y;
  this.gameBuffer.vertices[this.gameBuffer.vertices.count * this.gameBuffer.vertices.step + 2] = circle.r;
  this.gameBuffer.vertices[this.gameBuffer.vertices.count * this.gameBuffer.vertices.step + 3] = circle.g;
  this.gameBuffer.vertices[this.gameBuffer.vertices.count * this.gameBuffer.vertices.step + 4] = circle.b;
  this.gameBuffer.vertices.count++;
  this.setFloatValues();

然后我这样称呼它:

this.addBufferValue({x: x, y: y, r: 1, g: 1, b: 1});

这是我的渲染代码:

  this.gl.vertexAttribPointer(this.defaultShader.prog.attribs['vertexPos'], 2, this.gl.FLOAT,  false, 20, 0);
  this.gl.vertexAttribPointer(this.defaultShader.prog.attribs['acolour'], 3, this.gl.FLOAT,  false, 20, 8);
  this.drawDynamic(this.gameBuffer, this.gl.LINE_STRIP, this.gameBuffer.vertices.length / this.gameBuffer.vertices.step, 1);

  Game.prototype.drawDynamic = function(updatedData, method, count, step) {
     this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, updatedData.floatVertices);
     this.gl.drawArrays(method, 0, count * step);
  }

然而,我的线条宽度似乎只有1px,经过进一步研究,这似乎是唯一可用的厚度。我的问题是:是否有可能通过LINE_STRIP实现这种效果,如果是,我将如何实现这一目标。如果没有其他方法可以实现我的目标?

1 个答案:

答案 0 :(得分:4)

目前,Windows浏览器仅支持线宽1px(由于使用DirectX角度层)。正如你在这里看到的那样 - http://alteredqualia.com/tmp/webgl-linewidth-test/(在Chrome中试过,即和Firefox)

您需要做的是通过创建三角形来模拟线宽。

这需要在着色器中进行更多工作,并添加额外的顶点和属性。

背后的主要思想是根据线的角度将每个顶点添加两次,使用不同的属性偏移,并在着色器中相应地偏移顶点(考虑到当然的分辨率)。

enter image description here