1 // Write JavaScript here
2 var gl; // WebGL コンテキスト用のグローバル変数
4 var squareVerticesBuffer;
7 function webApplicationMain(){
21 var canvas = document.getElementById("GameCanvas");
24 gl = initWebGL(canvas);
26 var buffers = initBuffers();
28 var initshader = initShaders();
30 // WebGL を使用できる場合に限り、処理を継続
34 gl.clearColor(192/255, 192/255, 192/255, 1.0);
36 gl.enable(gl.DEPTH_TEST);
37 // 近くにある物体は、遠くにある物体を覆い隠す
38 gl.depthFunc(gl.LEQUAL);
39 // カラーバッファや深度バッファをクリアする
40 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
42 gl.viewport(0, 0, canvas.width, canvas.height);
45 var renderer = drawScene();
49 function initWebGL(canvas) {
54 // 標準コンテキストの取得を試みる。失敗した場合は、experimental にフォールバックする。
55 gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
59 // GL コンテキストを取得できない場合は終了する
61 alert("WebGL を初期化できません。ブラウザはサポートしていないようです。");
68 var horizAspect = 480.0/640.0;
70 function initBuffers() {
72 squareVerticesBuffer = gl.createBuffer();
73 gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
82 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
85 function initShaders() {
86 var fragmentShader = getShader(gl, "shader-fs");
87 var vertexShader = getShader(gl, "shader-vs");
91 shaderProgram = gl.createProgram();
92 gl.attachShader(shaderProgram, vertexShader);
93 gl.attachShader(shaderProgram, fragmentShader);
94 gl.linkProgram(shaderProgram);
96 // シェーダープログラムを作成できない場合はアラートを表示
98 if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
99 alert("シェーダープログラムを初期化できません。");
102 gl.useProgram(shaderProgram);
104 vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
105 gl.enableVertexAttribArray(vertexPositionAttribute);
108 function getShader(gl, id) {
109 var shaderScript, theSource, currentChild, shader;
111 shaderScript = document.getElementById(id);
118 currentChild = shaderScript.firstChild;
120 while(currentChild) {
121 if (currentChild.nodeType == currentChild.TEXT_NODE) {
122 theSource += currentChild.textContent;
125 currentChild = currentChild.nextSibling;
128 if (shaderScript.type == "x-shader/x-fragment") {
129 shader = gl.createShader(gl.FRAGMENT_SHADER);
130 } else if (shaderScript.type == "x-shader/x-vertex") {
131 shader = gl.createShader(gl.VERTEX_SHADER);
137 gl.shaderSource(shader, theSource);
140 gl.compileShader(shader);
143 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
144 alert("シェーダーのコンパイルでエラーが発生しました: " + gl.getShaderInfoLog(shader));
151 function drawScene() {
152 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
154 perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);
157 mvTranslate([-0.0, 0.0, -6.0]);
159 gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
160 gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
162 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
165 function loadIdentity() {
166 mvMatrix = Matrix.I(4);
169 function multMatrix(m) {
170 mvMatrix = mvMatrix.x(m);
173 function mvTranslate(v) {
174 multMatrix(Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4());
177 function setMatrixUniforms() {
178 var pUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
179 gl.uniformMatrix4fv(pUniform, false, new Float32Array(perspectiveMatrix.flatten()));
181 var mvUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
182 gl.uniformMatrix4fv(mvUniform, false, new Float32Array(mvMatrix.flatten()));