Shen/JS/Python/Erlang/Haskell/Clojure/OCaml/Go/Rust/Scala/Haxe
UX、フロントエンド、バックエンド、DSL作る人
バーテックス
シェーダ
ラスタライズ
フラグメント
シェーダ
頂点
データ
ピクセル
データ
頂点情報
ピクセル情報
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="script.js"></script>
</body>
</html>
attribute vec3 position;
varying vec2 pos;
void main(void){
pos = position.xy;
gl_Position = vec4(position, 1.0);
}
precision mediump float;
uniform vec2 origin;
varying vec2 pos;
void main(void){
gl_FragColor = vec4(vec3(0.1/length(pos - origin)), 1.0);
}
var canvas = document.getElementById("canvas");
var gl = canvas.getContext("webgl");
Promise.all(
[getFileText("hello.vert"),
getFileText("hello.frag")]
).then(function(values){
onShaderLoad(values[0], values[1]);
});
function getFileText(filePath){
return new Promise(function(resolve, reject){
var request = new XMLHttpRequest();
request.open("GET",filePath);
request.onload = function(){
resolve(request.responseText);
};
request.onError = function(){
reject("load Error");
}
request.send();
});
}
Ajaxでテキスト取得
しているが、
別にglslの
コードの文字列が
取得できれば
どうでも良い
var vertexShader = compileShader(gl, gl.VERTEX_SHADER, vsText);
var fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fsText);
function compileShader(gl, type, text) {
// シェーダオブジェクト作成
var shader = gl.createShader(type);
// シェーダソースを登録
gl.shaderSource(shader, text);
// コンパイル
gl.compileShader(shader);
if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
return shader;
} else {
return null;
}
}
var program = linkShader(vertexShader, fragmentShader);
function linkShader(vertexShader, fragmentShader) {
// プログラムオブジェクト作成
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (gl.getProgramParameter(program, gl.LINK_STATUS)) {
gl.useProgram(program);
return program;
} else {
return null;
}
}
var vertex_position = [
0.0, 0.0, 0.0,
-0.8, -0.8, 0.0,
0.8, -0.8, 0.0,
0.8, 0.8, 0.0,
-0.8, 0.8, 0.0
];
var index = [
0,1,2,
0,2,3,
0,3,4,
0,4,1
];
createVBO(gl, vertex_position);
function createVBO(gl, data){
var vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, null);
return vbo;
}
setAttribute("position", program, vertex_position, 3);
function setAttribute(vertexAtributeName, program, data, stride) {
// シェーダプログラムのattributeの位置を取得
var attribLocation = gl.getAttribLocation(program, vertexAtributeName);
// vboを作成し、頂点データを格納
var vbo = createVBO(data);
// vboをバインド
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
// attribute属性の有効化
gl.enableVertexAttribArray(attribLocation);
// 頂点データ登録
gl.vertexAttribPointer(attribLocation, stride, gl.FLOAT, false, 0, 0);
}
var ibo = createIBO(gl,index);
function createIBO(gl, data) {
var ibo = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
new Int16Array(data),
gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
return ibo;
}
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
gl.drawElements(gl.TRIANGLES, index.length, gl.UNSIGNED_SHORT, 0);
gl.flush();