WebGL: 几个入门小例子

本文通过WebGL例子,来帮助WebGL入门学习。

一、概述

WebGL (Web Graphics Library)是一组基于Open ES、在Web内渲染3D图形的Javascript APIs。

Ref. from Khronos Group: WebGL

WebGL™ is a cross-platform, royalty-free open web standard for a low-level 3D graphics API based on OpenGL ES, exposed to ECMAScript via the HTML5 Canvas element.

二、配置WebGL开发环境

三、例子1:绘制三角形

html 复制代码
<!DOCTYPE HTML>
<html lang="en">
	<head>
		<title>Draw a triangle</title>
		<meta charset="utf-8">
		<script type="text/javascript">
			var gl;
			var canvas;
			var shaderProgram;
			var vertexBuffer;
			function createGLContext(canvas)
			{
				var names = ["webgl", "experimental-webgl"];
				var context = null;
				for(var i = 0; i < names.length; i++)
				{
					try
					{
						context = canvas.getContext(names[i]);
					}
					catch(e)
					{
						if (context)
						{
							break;
						}
					}
				}
                if(context)
                {
                    context.viewportWidth = canvas.width;
                    context.viewportHeight = canvas.height;
                }
                else
                {
                    alert("Failed to create WebGL context!");
                }
                
                return context;
			}
            
            function loadShader(type, shaderSource)
            {
               var shader = gl.createShader(type);
               gl.shaderSource(shader, shaderSource);
               gl.compileShader(shader);
                
               if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
               {
                   alert("Error compiling shader" + gl.getShaderInfoLog(shader));
                   gl.deleteShader(shader);
                   return null
               }
                
               return shader;
            }
            
            function setupShaders()
            {
                var vertexShaderSource = 
                    "attribute vec3 aVertexPosition;				\n" +
                	"void main()									\n" + 
                	"{												\n" +
                    "	gl_Position = vec4(aVertexPosition, 1.0);	\n" + 
                    "}									            \n";
                
             	var fragmentShaderSource = 
                    "precision mediump float;						\n" +
                	"void main()									\n" + 
                	"{												\n" +
                    "	gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);	\n" + 
                    "}									            \n";
                
                var vertexShader = loadShader(gl.VERTEX_SHADER, vertexShaderSource);
                var fragmentShader = loadShader(gl.FRAGMENT_SHADER, fragmentShaderSource);
                
                shaderProgram = gl.createProgram();
                gl.attachShader(shaderProgram, vertexShader);
                gl.attachShader(shaderProgram, fragmentShader);
                
                gl.linkProgram(shaderProgram);
                
                if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS))
                {
                    alert("Failed to setup shaders!");
                }
                
                gl.useProgram(shaderProgram);
                
                shaderProgram.vertexPositionAttribute = 
                    gl.getAttribLocation(shaderProgram, "aVertexPosition");
            }
            
            function setupBuffers()
            {
                vertexBuffer = gl.createBuffer();
                gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
                
                var triangleVertices = [
                    0.0, 0.5, 0.0,
                    -0.5, -0.5, 0.0,
                    0.5, -0.5, 0.0
                ];
                gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);
                vertexBuffer.itemSize = 3;
                vertexBuffer.numberOfItems = 3;
            }
            
            function draw()
            {
                gl.viewport(0,0, gl.viewportWidth, gl.viewportHeight);
                gl.clear(gl.COLOR_BUFFER_BIT);
                
                gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
                gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
                gl.drawArrays(gl.TRIANGLES, 0, vertexBuffer.numberOfItems);
            }

            function startup()
            {
                canvas = document.getElementById("myGLCanvas");
                gl = createGLContext(canvas);
                setupShaders();
                setupBuffers();
                gl.clearColor(0.0,0.0,0.0,1.0);

                draw();
            }
            
		</script>
	</head>
	<body onload="startup();">
		<canvas id="myGLCanvas" width="500" height="500"></canvas>
	</body>
</html>

参考资料

Andreas Anyuru. Professional WebGL Programming: Developing 3D Graphics for the Web.

Kouichi Matsuda, Rodger Lea. WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL.

网络资料

WebGLhttps://www.khronos.org/webgl/

WebGL 2.0 Specificationhttps://registry.khronos.org/webgl/specs/latest/2.0/

Three.jshttps://threejs.org/

BabylonJShttps://www.babylonjs.com/

相关推荐
中二病码农不会遇见C++学姐11 小时前
包管理器:从“依赖地狱”到“软件宇宙”的演化史
其他
数据安全科普王16 小时前
当你的密码旅行时:公钥与私钥如何让互联网“锁”而不“死”
其他
SomeOtherTime20 小时前
化学反应相关问题(AI回答)
其他
老陈头聊SEO1 天前
有效利用长尾关键词提升SEO表现及搜索引擎流量的策略
其他·搜索引擎·seo优化
承渊政道1 天前
跨境远程办公工具横测:如何选择高稳定、低延迟的远程控制方案?
科技·其他·远程工作
wangluo1273 天前
2026年电子博览会前瞻:从底层技术革新看数据中心绿色低碳转型
其他
数据安全科普王3 天前
端口与进程的关系:网络服务是怎么“开门”的?
网络·其他
哲伦贼稳妥3 天前
职场发展-遇到以下情况请直接准备后手吧
运维·经验分享·其他·职场和发展
Vaticann4 天前
Claude Code From 0 to 1
其他
成都云希多肽生产厂家Gloria6 天前
Noopept N-(1-(苯基乙酰基)-L-脯氨酰)甘氨酸乙酯 CAS:157115-85-0
其他