在WebGL中渲染缓冲区副本时是否可以指定颜色?

尼古拉斯·希尔

这是我的片段着色器:

precision mediump float;

varying vec4 vColor;

void main(void) {
    gl_FragColor = vColor;
}

这是我的代码,用于渲染与圆关联的缓冲区(每个顶点的顶点和颜色):

gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, triangleVertexColorBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLE_FAN, 0, triangleVertexPositionBuffer.numItems);

是否有可能以某种方式渲染圆形的多个实例,从而每次都指定颜色?这样做是不好的做法吗?我是否应该制作多个圆圈,每个圆圈都有一个预先指定的颜色?

man

为什么不只将片段着色器更改为此呢?

precision mediump float;

uniform vec4 uColor;

void main(void) {
    gl_FragColor = uColor;
}

然后您可以设置颜色以绘制每个圆

gl.uniform4fv(program.uniforms['uColor'], colorOfCircleArrayOf4Floats);

这是一个例子

var countElem = document.getElementById("t");
var canvas = document.getElementById("c");
var gl = canvas.getContext("webgl",
                           {preserveDrawingBuffer:true});
var program = twgl.createProgramFromScripts(
    gl, ["vshader", "fshader"], ["a_position"]);
gl.useProgram(program);

var colorLoc = gl.getUniformLocation(program, "u_color");
var matrixLoc = gl.getUniformLocation(program, "u_matrix");

// make circle triangles
var numDivisions = 36;
var verts = [];
for (var ii = 0; ii <= numDivisions; ++ii) {
    var a0 = (ii + 0) * Math.PI * 2 / numDivisions;
    var a1 = (ii + 1) * Math.PI * 2 / numDivisions;
    verts.push(Math.sin(a0), Math.cos(a0));
}

var vertBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);

// make matrix to scale our unit circle.
var aspect = canvas.width / canvas.height;
var scale = 0.25;
var mat = [
    scale, 0, 0, 0,
    0, aspect * scale, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1];
    
function draw() {
   // set translation
   mat[12] = Math.random() * 2 - 1;
   mat[13] = Math.random() * 2 - 1;
   gl.uniformMatrix4fv(matrixLoc, false, mat);
    
   // set color
   gl.uniform4f(colorLoc, Math.random(), Math.random(), Math.random(), 1);

   // draw circle
   gl.drawArrays(gl.TRIANGLE_FAN, 0, numDivisions + 1);
   requestAnimationFrame(draw);
}
draw();
<script src="https://twgljs.org/dist/3.x/twgl.min.js"></script>
<script id="vshader" type="whatever">
    attribute vec4 a_position;
    uniform mat4 u_matrix;
    void main() {
      gl_Position = u_matrix * a_position;
    }    
</script>
<script id="fshader" type="whatever">
precision mediump float;
uniform vec4 u_color;
void main() {
  gl_FragColor = u_color;
}
</script>
<canvas id="c"></canvas>

请注意,此处给出了相同的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用颜色缓冲区时WebGL渲染失败

来自分类Dev

WebGL 渲染缓冲区

来自分类Dev

是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

来自分类Dev

WebGL-从内存渲染缓冲区

来自分类Dev

示例默认 WebGL 颜色缓冲区

来自分类Dev

WebGL。是否在GPU中创建缓冲区?

来自分类Dev

WebGL中的模板缓冲区

来自分类Dev

是否可以在C ++中以零拷贝拼接缓冲区?

来自分类Dev

WebGL:同时使用纹理和颜色缓冲区

来自分类Dev

是否可以将纹理作为渲染目标附加到默认帧缓冲区?

来自分类Dev

在渲染过程的不同子过程中写入相同的颜色缓冲区

来自分类Dev

OpenGL ES 2.0是否可以同时绘制深度和“颜色”缓冲区(不使用MRT)?

来自分类Dev

使用WebGL2通过Alpha混合渲染到帧缓冲区时的伪像

来自分类Dev

是否可以在frama-c中指定缓冲区访问子句?

来自分类Dev

在D3D12中,渲染目标视图可以是任何缓冲区吗?

来自分类Dev

在OpenGL中,一个着色程序是否可以在一次绘制调用中同时渲染到FBO和默认的帧缓冲区?

来自分类Dev

webgl中绑定缓冲区的逻辑是什么?

来自分类Dev

更新WebGL 2中的统一缓冲区数据?

来自分类Dev

更新WebGL 2中的统一缓冲区数据?

来自分类Dev

多采样帧缓冲区仅在渲染缓冲区中不完整

来自分类Dev

如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

来自分类Dev

模具传递是否写入颜色缓冲区?

来自分类Dev

FFMPEG:在解码视频时,是否可以将结果生成到用户提供的缓冲区?

来自分类Dev

是否可以区分暂存缓冲区和新的[no name]缓冲区?

来自分类Dev

Linux中如何测量帧缓冲区的渲染时间?

来自分类Dev

我是否可以在OpenGL 2.1的多个共享上下文中同时从同一缓冲区对象进行渲染?

来自分类Dev

如何在到达缓冲区而不是缓冲区已满时读取缓冲区中的数据?

来自分类Dev

是否可以在Linux中捕获应用程序屏幕缓冲区?

来自分类Dev

是否可以从套接字到带有“零复制”的缓冲区中的splice()?

Related 相关文章

  1. 1

    使用颜色缓冲区时WebGL渲染失败

  2. 2

    WebGL 渲染缓冲区

  3. 3

    是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

  4. 4

    WebGL-从内存渲染缓冲区

  5. 5

    示例默认 WebGL 颜色缓冲区

  6. 6

    WebGL。是否在GPU中创建缓冲区?

  7. 7

    WebGL中的模板缓冲区

  8. 8

    是否可以在C ++中以零拷贝拼接缓冲区?

  9. 9

    WebGL:同时使用纹理和颜色缓冲区

  10. 10

    是否可以将纹理作为渲染目标附加到默认帧缓冲区?

  11. 11

    在渲染过程的不同子过程中写入相同的颜色缓冲区

  12. 12

    OpenGL ES 2.0是否可以同时绘制深度和“颜色”缓冲区(不使用MRT)?

  13. 13

    使用WebGL2通过Alpha混合渲染到帧缓冲区时的伪像

  14. 14

    是否可以在frama-c中指定缓冲区访问子句?

  15. 15

    在D3D12中,渲染目标视图可以是任何缓冲区吗?

  16. 16

    在OpenGL中,一个着色程序是否可以在一次绘制调用中同时渲染到FBO和默认的帧缓冲区?

  17. 17

    webgl中绑定缓冲区的逻辑是什么?

  18. 18

    更新WebGL 2中的统一缓冲区数据?

  19. 19

    更新WebGL 2中的统一缓冲区数据?

  20. 20

    多采样帧缓冲区仅在渲染缓冲区中不完整

  21. 21

    如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

  22. 22

    模具传递是否写入颜色缓冲区?

  23. 23

    FFMPEG:在解码视频时,是否可以将结果生成到用户提供的缓冲区?

  24. 24

    是否可以区分暂存缓冲区和新的[no name]缓冲区?

  25. 25

    Linux中如何测量帧缓冲区的渲染时间?

  26. 26

    我是否可以在OpenGL 2.1的多个共享上下文中同时从同一缓冲区对象进行渲染?

  27. 27

    如何在到达缓冲区而不是缓冲区已满时读取缓冲区中的数据?

  28. 28

    是否可以在Linux中捕获应用程序屏幕缓冲区?

  29. 29

    是否可以从套接字到带有“零复制”的缓冲区中的splice()?

热门标签

归档