WebGL入门研究

作者的博客https://wgld.org/

清空背景

index.html

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>wgld.org WebGL sample 001</title>
		<script src="script.js" type="text/javascript"></script>
	</head>
	<body>
		<canvas id="canvas"></canvas>
	</body>
</html>

script.js



onload = function(){
	var c = document.getElementById('canvas');
	c.width = 500;
	c.height = 300;

	var gl = c.getContext('webgl') || c.getContext('experimental-webgl');
	
	gl.clearColor(0.0, 0.0, 0.0, 1.0);
	gl.clear(gl.COLOR_BUFFER_BIT);
};

绘制三角形

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>wgld.org WebGL sample 002</title>
		<script src="script.js" type="text/javascript"></script>
		<script src="https://wgld.org/j/minMatrix.js" type="text/javascript"></script>
		
		<script id="vs" type="x-shader/x-vertex">
attribute vec3 position;
uniform   mat4 mvpMatrix;

void main(void){
	gl_Position = mvpMatrix * vec4(position, 1.0);
}
		</script>
		
		<script id="fs" type="x-shader/x-fragment">
void main(void){
	gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
		</script>
	</head>
	<body>
		<canvas id="canvas"></canvas>
	</body>
</html>
// sample_002
//
// WebGLでポリゴンを描画する

onload = function(){
	// canvasエレメントを取得
	var c = document.getElementById('canvas');
	c.width = 300;
	c.height = 300;

	// webglコンテキストを取得
	var gl = c.getContext('webgl') || c.getContext('experimental-webgl');
	
	// canvasを初期化する色を設定する
	gl.clearColor(0.0, 0.0, 0.0, 1.0);
	
	// canvasを初期化する際の深度を設定する
	gl.clearDepth(1.0);
	
	// canvasを初期化
	gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
	
	// 頂点シェーダとフラグメントシェーダの生成
    // 生成顶点和片段着色器
	var v_shader = create_shader('vs');
	var f_shader = create_shader('fs');
	
	// プログラムオブジェクトの生成とリンク
    // 创建和链接程序对象
	var prg = create_program(v_shader, f_shader);
	
	// attributeLocationの取得
	var attLocation = gl.getAttribLocation(prg, 'position');
	
	// attribute的元素数量(这次只使用 xyz ,所以是3)
	var attStride = 3;
	
	// モデル(頂点)データ
	var vertex_position = [
		 0.0, 1.0, 0.0,
		 1.0, 0.0, 0.0,
		-1.0, 0.0, 0.0
	];
	
	// VBOの生成
	var vbo = create_vbo(vertex_position);
	
	// VBOをバインド
    // 绑定VBO
	gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
	
	// 设定attribute属性有効
	gl.enableVertexAttribArray(attLocation);
	
	// attribute属性を登録 添加attribute属性
	gl.vertexAttribPointer(attLocation, attStride, gl.FLOAT, false, 0, 0);
	
	// minMatrix.js を用いた行列関連処理
	// matIVオブジェクトを生成
	var m = new matIV();
	
	// 各種行列の生成と初期化
	var mMatrix = m.identity(m.create());
	var vMatrix = m.identity(m.create());
	var pMatrix = m.identity(m.create());
	var mvpMatrix = m.identity(m.create());
	
	// 视图变换坐标矩阵
	m.lookAt([0.0, 1.0, 3.0], [0, 0, 0], [0, 1, 0], vMatrix);
	
	// 投影坐标变换矩阵
	m.perspective(90, c.width / c.height, 0.1, 100, pMatrix);
	
	// 各矩阵想成,得到最终的坐标变换矩阵
	m.multiply(pMatrix, vMatrix, mvpMatrix);
	m.multiply(mvpMatrix, mMatrix, mvpMatrix);
	
	// uniformLocationの取得
	var uniLocation = gl.getUniformLocation(prg, 'mvpMatrix');
	
	// uniformLocationへ座標変換行列を登録
	gl.uniformMatrix4fv(uniLocation, false, mvpMatrix);
	
	// 绘制模型
	gl.drawArrays(gl.TRIANGLES, 0, 3);
	
	//刷新
	gl.flush();
	
	// シェーダを生成する関数
	function create_shader(id){
		// シェーダを格納する変数
		var shader;
		
		// HTMLからscriptタグへの参照を取得
		var scriptElement = document.getElementById(id);
		
		// scriptタグが存在しない場合は抜ける
		if(!scriptElement){return;}
		
		// scriptタグのtype属性をチェック
		switch(scriptElement.type){
			
			// 頂点シェーダの場合
			case 'x-shader/x-vertex':
				shader = gl.createShader(gl.VERTEX_SHADER);
				break;
				
			// フラグメントシェーダの場合
			case 'x-shader/x-fragment':
				shader = gl.createShader(gl.FRAGMENT_SHADER);
				break;
			default :
				return;
		}
		
		// 生成されたシェーダにソースを割り当てる
		gl.shaderSource(shader, scriptElement.text);
		
		// シェーダをコンパイルする
		gl.compileShader(shader);
		
		// シェーダが正しくコンパイルされたかチェック
		if(gl.getShaderParameter(shader, gl.COMPILE_STATUS)){
			
			// 成功していたらシェーダを返して終了
			return shader;
		}else{
			
			// 失敗していたらエラーログをアラートする
			alert(gl.getShaderInfoLog(shader));
		}
	}
	
	// プログラムオブジェクトを生成しシェーダをリンクする関数
	function create_program(vs, fs){
		// プログラムオブジェクトの生成
		var program = gl.createProgram();
		
		// プログラムオブジェクトにシェーダを割り当てる
		gl.attachShader(program, vs);
		gl.attachShader(program, fs);
		
		// シェーダをリンク
		gl.linkProgram(program);
		
		// シェーダのリンクが正しく行なわれたかチェック
		if(gl.getProgramParameter(program, gl.LINK_STATUS)){
		
			// 成功していたらプログラムオブジェクトを有効にする
			gl.useProgram(program);
			
			// プログラムオブジェクトを返して終了
			return program;
		}else{
			
			// 失敗していたらエラーログをアラートする
			alert(gl.getProgramInfoLog(program));
		}
	}
	
	// VBOを生成する関数
	function create_vbo(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);
		
		// 生成した VBO を返して終了
		return vbo;
	}

};
发布了194 篇原创文章 · 获赞 8 · 访问量 9873

猜你喜欢

转载自blog.csdn.net/qq_43439240/article/details/104186448