WebGL-03.图元绘制

本系列教程主要讲解利用WebGL开发网页版的三维图形程序。这里主要用到的OpenGL和FlyMath内容。本系列内容较难。要求学生对几何和编程有一定的了解。建议初三以上同学学习。

在WebGL里有画点、线、面的工具。因为WebGL是基于OpenGL ES2的,所以所有的绘制命令都要用GLSL来绘制。以前的glbegin/glend,大家就忘掉它了吧。

WebGL提供有以下图元支持

 

const GLenum POINTS = 0x0000;
const GLenum LINES = 0x0001;
const GLenum LINE_LOOP = 0x0002;
const GLenum LINE_STRIP = 0x0003;
const GLenum TRIANGLES = 0x0004;
const GLenum TRIANGLE_STRIP = 0x0005;
const GLenum TRIANGLE_FAN = 0x0006;

跟OpenGL差不多,去掉了Quad图元。WebGL绘制图元全是用GLSL语言来完成。因此要定义VS和PS。这两个什么东西,顶点Shader和片断Shader。不多解释。其声明定义和OpenGL里一样,先定义,再绑定。再引用。过程比较麻烦。但也好理解。就是什么数据都以数组形式放入缓冲区里备用。看程序大家都能看懂。


webgl.htm源文件

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html>
<title>WebGL_03:绘制图元</title>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<script type="text/javascript" src='jquery-1.11.1.min.js' charset="utf-8"></script>
<script>
    
//初始化WebGL
function init_webgl()
{
  var canvas = document.getElementById("webGL");
  if(!canvas){
    alert("获取<Canvas>标签失败!");
    return;
  }
    
  //获取webGL统计图上下文
  var gl_context = canvas.getContext('webgl',
                { antialias:true,
                  stencil:true});
    
  if(!gl_context){
    alert("获取WebGL上下文失败!");
  }
    
  canvas.width = $("#area").width();
  canvas.height = $("#area").width()*3/5;
    
  //设置视口大小
  gl_context.viewport(0,0,canvas.width,canvas.height);
    
  //清空canvas的背景颜色
  gl_context.clearColor(0,0,0.5,1);
    
  //清空webgl颜色缓冲区里的内容
  gl_context.clear(gl_context.COLOR_BUFFER_BIT);
    
    draw_triangle(gl_context);
}
    
//绘制三角形
function draw_triangle(gl_context)
{
//定义顶点shader和片断shader
  var vs_src = "attribute vec4 a_Position;\n" +
    "void main() {\n" +
    "   gl_Position = a_Position;\n"+
    "}\n";
    
  var fs_src = "void main() {\n" +
    " gl_FragColor = vec4(1,1,0,1);\n" +
    "}\n";
    
  var vs = gl_context.createShader(gl_context.VERTEX_SHADER);
  gl_context.shaderSource(vs,vs_src);
  gl_context.compileShader(vs);
      
  if(!gl_context.getShaderParameter(vs,gl_context.COMPILE_STATUS)){
    alert(gl_context.getShaderInfoLog(vs));
    return;
    }
    
  var fs = gl_context.createShader(gl_context.FRAGMENT_SHADER);
  gl_context.shaderSource(fs,fs_src);
  gl_context.compileShader(fs);
      
  if(!gl_context.getShaderParameter(vs,gl_context.COMPILE_STATUS)){
    alert(gl_context.getShaderInfoLog(fs));
    return;
  }
  if(!gl_context.getProgramParameter(shaderProgram, gl_context.LINK_STATUS)) {
      alert("Could not initialise shaders");
  }
//加载选择的顶点和片断
  var shaderProgram = gl_context.createProgram();
  gl_context.attachShader(shaderProgram, vs);
  gl_context.attachShader(shaderProgram, fs);
  gl_context.linkProgram(shaderProgram);
    
//绑定shader中的参数变量
  var shader_pos = gl_context.getAttribLocation(shaderProgram, "a_Position");
    
  var vertices = new Float32Array([0.0,0.5,-0.5,-0.5,0.5,-0.5]);
  var tri_buf = gl_context.createBuffer();
  gl_context.bindBuffer(gl_context.ARRAY_BUFFER, tri_buf);
  gl_context.bufferData(gl_context.ARRAY_BUFFER, new Float32Array(vertices), gl_context.STATIC_DRAW);
    
//使用选择的程序,激活缓冲区,渲染
  gl_context.useProgram(shaderProgram);
  gl_context.enableVertexAttribArray(shader_pos);
  gl_context.vertexAttribPointer(shader_pos, 2, gl_context.FLOAT, false, 0, 0);
        
  gl_context.drawArrays(gl_context.TRIANGLES,0,3);
}
</script>
</head>
<body>
   
<div id='area' style='width:100%;text-align:center;'>
<canvas id='webGL' width='600' height='400' style='border:1px solid #000000;'>
<b>浏览器不支持Webgl_context.</b>
</canvas>
</div>
   
</body>
<script>init_webgl();</script>
</html>

运行范例

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值