WebGLその5:テクスチャ描画
■index.html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>SanoWebGLSample05.html</title> </head> <script type="text/javascript" src="webglut01.js"></script> <script id="shader-vs" type="x-shader/x-vertex"> //------------------------------------------------------------------------ // ヴァーテックスシェーダー //------------------------------------------------------------------------ attribute vec2 pos; attribute vec2 uv; varying vec2 texCoord; void main(void) { gl_Position = vec4( pos, 0.0, 1.0 ); texCoord = uv; } </script> <script id="shader-fs" type="x-shader/x-fragment"> //------------------------------------------------------------------------ // ピクセルシェーダー //------------------------------------------------------------------------ #ifdef GL_ES precision highp float; #endif uniform sampler2D sampler2d; varying vec2 texCoord; void main(void) { gl_FragColor = texture2D( sampler2d, texCoord ); } </script> <script> //------------------------------------------------------------------------ // //------------------------------------------------------------------------ var gl; //gl用コンテキスト var vertexModel; //頂点 var uvModel; //UV var imageData; //イメージデータ var shaderProgram; //シェーダー //------------------------------------------------------------------------ // 初期化 //------------------------------------------------------------------------ function init() { // gl用コンテキストを取得 gl = Ginit( document.getElementById("c") ); // gl.enable( gl.DEPTH_TEST ); gl.enable( gl.BLEND ); gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA ); gl.enable( gl.TEXTURE_2D ); // シェーダ初期化 shaderProgram = GinitShaders( "shader-vs", "shader-fs" ); shaderProgram.vertexPositionAttribute = gl.getAttribLocation( shaderProgram, "pos" ); gl.enableVertexAttribArray( shaderProgram.vertexPositionAttribute ); shaderProgram.textureCoordAttribute = gl.getAttribLocation( shaderProgram, "uv" ); gl.enableVertexAttribArray( shaderProgram.textureCoordAttribute ); // モデル設定 initMode(); // メインループ登録 setInterval( "MainLoop()", 33 ); } //------------------------------------------------------------------------ // メインループ //------------------------------------------------------------------------ function MainLoop() { // 画面クリア Gclear(); // 描画 drawMode(); } //------------------------------------------------------------------------ //モデル情報の初期化 //------------------------------------------------------------------------ function initMode() { // 頂点情報の設定 var vertices =[ 0.0, 0.5, -0.5, -0.5, 0.5, -0.5 ]; vertexModel = gl.createBuffer(); gl.bindBuffer( gl.ARRAY_BUFFER, vertexModel ); gl.bufferData( gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW ); vertexModel.itemSize = 2; vertexModel.numItems = 3; // UV情報の設定 var uvData = [ 1.0, 0.0, 0.0, 0.0, 1.0, 1.0 ]; uvModel = gl.createBuffer(); gl.bindBuffer( gl.ARRAY_BUFFER, uvModel ); gl.bufferData( gl.ARRAY_BUFFER, new Float32Array(uvData), gl.STATIC_DRAW ); uvModel.itemSize = 2; uvModel.numItems = 3; // イメージ情報の設定 imageData = gl.createTexture(); imageData.image = new Image(); imageData.image.onload = function() { gl.bindTexture( gl.TEXTURE_2D, imageData ); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, imageData.image ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); gl.bindTexture( gl.TEXTURE_2D, null ); } imageData.image.src = "ren01.jpg"; } //------------------------------------------------------------------------ // モデル情報の描画 //------------------------------------------------------------------------ function drawMode() { gl.bindBuffer( gl.ARRAY_BUFFER, vertexModel ); gl.vertexAttribPointer( shaderProgram.vertexPositionAttribute, vertexModel.itemSize, gl.FLOAT, false, 0, 0 ); gl.bindBuffer( gl.ARRAY_BUFFER, uvModel ); gl.vertexAttribPointer( shaderProgram.textureCoordAttribute, uvModel.itemSize, gl.FLOAT, false, 0, 0); gl.bindTexture( gl.TEXTURE_2D, imageData ); gl.drawArrays( gl.TRIANGLES, 0, vertexModel.numItems ); } </script> </head> <body onload="init();"> <canvas id="c" style="border:none" width="640" height="480"> </body> </html>
■[WebGLその3:ポリゴン表示]で使われた「webglut01.js」を使います。
http://d.hatena.ne.jp/sanoh/20120328
■イメージファイル
このサンプルではまったのが、テクスチャファイルの場所、最初、ローカル環境で開発していたのですが、いくらやってもファイルが読み込めず、サーバにおいたら、すんなり読み込めてショックでした。
「ren01.jpg」
■UV値は頂点カラーと同じように、別途、送りましょう
あと、テクスチャ表示には、おまじないのようにこれを記述
gl.enable( gl.DEPTH_TEST ); gl.enable( gl.BLEND ); gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA ); gl.enable( gl.TEXTURE_2D );