Webgl-colors

提供:Dev Guides
移動先:案内検索

WebGL-色

これまでのすべての例では、 gl_FragColor 変数に目的の色の値を割り当てることにより、オブジェクトに色を適用しました。 それに加えて、頂点の座標とインデックスのように、各頂点の色を定義できます。 この章では、WebGLを使用して四角形に色を適用する方法を示す例を取り上げます。

色を適用する

色を適用するには、JavaScript配列でRGB値を使用して各頂点の色を定義する必要があります。 同じ値をすべての頂点に割り当てて、オブジェクトに一意の色を付けることができます。 色を定義したら、カラーバッファーを作成してこれらの値を保存し、頂点シェーダー属性に関連付ける必要があります。

頂点シェーダーで、座標属性(頂点の位置を保持する)とともに、色を処理するために*属性*および*可変*を定義します。

*color* 属性は頂点ごとの色の値を保持し、 *varying* はフラグメントシェーダーへの入力として渡される変数です。 したがって、 *color* 値を *varying* に割り当てる必要があります。

フラグメントシェーダーでは、色の値を保持する varyinggl_FragColor に割り当てられ、オブジェクトの最終的な色が保持されます。

色を適用する手順

WebGLアプリケーションを作成してクワッドを描画し、それに色を適用するには、次の手順が必要です。

ステップ1-キャンバスを準備し、WebGLレンダリングコンテキストを取得

このステップでは、* getContext()*を使用してWebGLレンダリングコンテキストオブジェクトを取得します。

ステップ2-ジオメトリを定義し、バッファオブジェクトに格納します

正方形は、2つの三角形を使用して描画できます。 したがって、この例では、2つの三角形(1つの共通エッジ)とインデックスの頂点を提供します。 色を適用するため、色の値を保持する変数も定義され、それぞれの色の値(赤、青、緑、ピンク)が割り当てられます。

var vertices = [
   -0.5,0.5,0.0,
   -0.5,-0.5,0.0,
   0.5,-0.5,0.0,
   0.5,0.5,0.0
];

var colors = [ 0,0,1, 1,0,0, 0,1,0, 1,0,1,];
indices = [3,2,1,3,1,0];

ステップ3-シェーダープログラムの作成とコンパイル

この手順では、頂点シェーダーおよびフラグメントシェーダープログラムを記述し、それらをコンパイルし、これらの2つのプログラムをリンクして結合プログラムを作成する必要があります。

  • Vertex Shader -プログラムの頂点シェーダーで、3D座標(位置)と各頂点の色を格納するベクトル属性を定義します。 varing 変数は、頂点シェーダーからフラグメントシェーダーにカラー値を渡すために宣言されます。 そして最後に、色属性に保存された値が*変数*に割り当てられます。
var vertCode = 'attribute vec3 coordinates;'+
   'attribute vec3 color;'+
   'varying vec3 vColor;'+

   'void main(void) {' +
      ' gl_Position = vec4(coordinates, 1.0);' +
      'vColor = color;'+
   '}';
  • フラグメントシェーダー-フラグメントシェーダーでは、 varyinggl_FragColor 変数に割り当てます。
var fragCode = 'precision mediump float;'+
   'varying vec3 vColor;'+
   'void main(void) {'+
      'gl_FragColor = vec4(vColor, 1.);'+
   '}';

ステップ4-シェーダープログラムをバッファオブジェクトに関連付ける

この手順では、バッファーオブジェクトとシェーダープログラムを関連付けます。

ステップ5-必要なオブジェクトの描画

インデックスを使用して、四角形を形成する2つの三角形を描画しているため、メソッド* drawElements()を使用します。 このメソッドには、インデックスの数を渡す必要があります。 *indices.length の値は、インデックスの数を示します。

gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);

例–色の適用

次のプログラムは、WebGLアプリケーションを使用して四角形を描画し、色を適用する方法を示しています。

<!doctype html>
<html>
   <body>
    <canvas width = "300" height = "300" id = "my_Canvas"></canvas>

      <script>
        /*============= Creating a canvas ==================*/
         var canvas = document.getElementById('my_Canvas');
         gl = canvas.getContext('experimental-webgl');

        /*========== Defining and storing the geometry ==========*/

         var vertices = [
            -0.5,0.5,0.0,
            -0.5,-0.5,0.0,
            0.5,-0.5,0.0,
            0.5,0.5,0.0
         ];

         var colors = [0,0,1, 1,0,0, 0,1,0, 1,0,1,];

         indices = [3,2,1,3,1,0];

        //Create an empty buffer object and store vertex data
         var vertex_buffer = gl.createBuffer();
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
         gl.bindBuffer(gl.ARRAY_BUFFER, null);

        //Create an empty buffer object and store Index data
         var Index_Buffer = gl.createBuffer();
         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);

        //Create an empty buffer object and store color data
         var color_buffer = gl.createBuffer ();
         gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);

        /*======================= Shaders =======================*/

        //vertex shader source code
         var vertCode = 'attribute vec3 coordinates;'+
            'attribute vec3 color;'+
            'varying vec3 vColor;'+
            'void main(void) {' +
               ' gl_Position = vec4(coordinates, 1.0);' +
               'vColor = color;'+
            '}';

        //Create a vertex shader object
         var vertShader = gl.createShader(gl.VERTEX_SHADER);

        //Attach vertex shader source code
         gl.shaderSource(vertShader, vertCode);

        //Compile the vertex shader
         gl.compileShader(vertShader);


        //fragment shader source code
         var fragCode = 'precision mediump float;'+
            'varying vec3 vColor;'+
            'void main(void) {'+
               'gl_FragColor = vec4(vColor, 1.);'+
            '}';

        //Create fragment shader object
         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);

        //Attach fragment shader source code
         gl.shaderSource(fragShader, fragCode);

        //Compile the fragmentt shader
         gl.compileShader(fragShader);

        //Create a shader program object to
        //store the combined shader program
         var shaderProgram = gl.createProgram();

        //Attach a vertex shader
         gl.attachShader(shaderProgram, vertShader);

        //Attach a fragment shader
         gl.attachShader(shaderProgram, fragShader);

        //Link both the programs
         gl.linkProgram(shaderProgram);

        //Use the combined shader program object
         gl.useProgram(shaderProgram);

        /* ======== Associating shaders to buffer objects =======*/

        //Bind vertex buffer object
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);

        //Bind index buffer object
         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);

        //Get the attribute location
         var coord = gl.getAttribLocation(shaderProgram, "coordinates");

        //point an attribute to the currently bound VBO
         gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);

        //Enable the attribute
         gl.enableVertexAttribArray(coord);

        //bind the color buffer
         gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);

        //get the attribute location
         var color = gl.getAttribLocation(shaderProgram, "color");

        //point attribute to the volor buffer object
         gl.vertexAttribPointer(color, 3, gl.FLOAT, false,0,0) ;

        //enable the color attribute
         gl.enableVertexAttribArray(color);

        /*============Drawing the Quad====================*/

        //Clear the canvas
         gl.clearColor(0.5, 0.5, 0.5, 0.9);

        //Enable the depth test
         gl.enable(gl.DEPTH_TEST);

        //Clear the color buffer bit
         gl.clear(gl.COLOR_BUFFER_BIT);

        //Set the view port
         gl.viewport(0,0,canvas.width,canvas.height);

        //Draw the triangle
         gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);
      </script>
   </body>
</html>

この例を実行すると、次の出力が生成されます-