WebGL:将多色着色器应用于 4 个三角形

WebGL: applying multi-color shader to 4 triangles

这里是 WebGL 的新手。我使用 WebGL 绘制了几个看起来像矩形的三角形。我将颜色声明为一个变量,想知道如何将多色效果应用于不仅仅是最后绘制的两个三角形?理想情况下,我希望右边的图像都具有彩虹效果。

这是关于顶点位置和颜色的代码

var gl;
var vertices_and_colors = new Float32Array(6*3*4);


   window.onload = function init()
{

var canvas = document.getElementById( "gl-canvas" );

gl = WebGLUtils.setupWebGL( canvas );
if ( !gl ) { alert( "WebGL isn't available" ); }


var vertices_and_colors = [
                           vec3(-0.5, -.55, 0.0), //left triangles, 1
                           vec3(-0.5,  0.25, 0.0),
                           vec3(-0.40, -0.55, 0.0),

                           vec3(-0.40, 0.25, 0.0), //left 2
                           vec3(-0.40,  -0.55, 0.0),
                           vec3(-0.5, 0.25, 0.0),
                           vec3(-0.15, 0.25, 0.0),   //l3
                           vec3(-0.5,  0.25, 0.0),
                           vec3(-0.15, 0.15, 0.0),
                           vec3(-0.5, 0.15, 0.0),   //l4
                           vec3(-0.15,  0.15, 0.0),
                           vec3(-0.5, 0.25, 0.0),



                           vec3(0.35, -0.55, 0.0),  //right triangle 1
                           vec3(0.35,  0.15, 0.0),
                           vec3(0.25, -0.55, 0.0),
                           vec3(0.25, 0.15, 0.0),
                           vec3(0.25,  -0.55, 0.0),
                           vec3(0.35, 0.15, 0.0),

                           vec3(0.10, 0.25, 0.0),    //top of 't' (rainbow)
                           vec3(0.5,  0.25, 0.0),
                           vec3(0.10, 0.15, 0.0),
                           vec3(0.5, 0.15, 0.0),
                           vec3(0.10,  0.15, 0.0),
                           vec3(0.5, 0.25, 0.0),

                           vec3(1.0, 0.0, 0.0), // r
                           vec3(0.0, 1.0, 0.0), // g
                           vec3(0.0, 0.0, 1.0), // b
                           vec3(0.0, 1.0, 1.0), // c
                           vec3(1.0, 0.0, 1.0), // m
                           vec3(1.0, 1.0, 0.0), // y


                           ];

gl.viewport( 0, 0, canvas.width, canvas.height );
gl.clearColor( 0.8, 0.8, 0.8, 1.0 );

    var program = initShaders( gl, "vertex-shader", "fragment-shader" );
   gl.useProgram( program );

  var bufferId = gl.createBuffer();
   gl.bindBuffer( gl.ARRAY_BUFFER, bufferId );

       gl.bufferData( gl.ARRAY_BUFFER, flatten(vertices_and_colors),    gl.STATIC_DRAW );


gl.vertexAttribPointer( vPosition, 3, gl.FLOAT, false, 0, 0 );

gl.enableVertexAttribArray( vPosition );


var vColor = gl.getAttribLocation( program, "vColor" );
   gl.vertexAttribPointer( vColor, 3, gl.FLOAT, false, 0, 6*3*4 ); //6
gl.enableVertexAttribArray( vColor );

render();
};

function render() {
    gl.clear( gl.COLOR_BUFFER_BIT );
    // draw the data as an array of points
    gl.drawArrays( gl.TRIANGLES, 0, 24 ); //30
    //gl.drawArrays( gl.TRIANGLE.STRIP, 21, 30);
}

完全不清楚您的代码在做什么。你有 18 个位置,但只有 12 个顶点颜色,而你用 24 个调用 gl.drawArrays

你需要与位置相同数量的顶点颜色,所以要么都是 18,要么都是 12。然后你需要用正确的数字调用 gl.drawArrays。 18 或 12。

另外,我建议您对顶点颜色和位置使用单独的缓冲区。它只是让事情变得更容易,但由于你将它们组合在一起,你对颜色的偏移是错误的

gl.vertexAttribPointer( vColor, 3, gl.FLOAT, false, 0, 6*3*4 ); 

您有 18 个位置,每个位置有 3 个值,每个位置有 4 个字节,所以是 18 * 3 * 4

如果您为位置和顶点颜色使用单独的缓冲区,那么您就不必进行计算。少一件事出错。

You also might find these articles helpful