WebGL画点程序v2

来源:互联网 发布:定情信物 知乎 编辑:程序博客网 时间:2024/05/29 14:57

本文程序实现画一个点的任务,如下图。其中,点的位置坐标由Javascript传到着色器程序中,而不是直接给定(“硬编码”)在顶点着色器中。

Hello_Point

整个程序包含两个文件,分别是:

1. HelloPoint2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">        <title>画一个点</title>    </head>    <body onload="startup()">        <canvas id="myGLCanvas" width="640" height="480">        </canvas>    </body>    <script type="text/javascript" src="HelloPoint2.js">    </script></html>

2. HelloPoint2.js

var gl;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]); //获取webgl context绘图上下文    } 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 vec4 a_Position;\n' + // attribute variable      'void main() {\n' +      '  gl_Position = a_Position;\n' +      '  gl_PointSize = 10.0;\n' +      '}\n';     //片元着色器程序    var fragmentShaderSource =       'void main(){ \n' +      '    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n' + //gl_FragColor指定像素的颜色      '} \n';                                           var vertexShader = loadShader(gl.VERTEX_SHADER, vertexShaderSource);  var fragmentShader = loadShader(gl.FRAGMENT_SHADER, fragmentShaderSource);  var 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);  gl.program= shaderProgram;}function startup(){    var canvas = document.getElementById('myGLCanvas');//获取<canvas>元素    gl = createGLContext(canvas);    setupShaders();     // Get the storage location of a_Position    var a_PosLocation = gl.getAttribLocation(gl.program, 'a_Position');    if (a_PosLocation < 0) {      console.log('Failed to get the storage location of a_Position');      return;    }    // Pass vertex position to attribute variable    gl.vertexAttrib3f(a_PosLocation, 0.0, 0.0, 0.0);    gl.clearColor(0.0, 0.0, 0.0, 1.0);//指定清空<canvas>的颜色        gl.clear(gl.COLOR_BUFFER_BIT);//清空<canvas>    gl.drawArrays(gl.POINTS, 0, 1);//从第0个元素开始,在指定位置(gl_Position)画1个点 }

参考代码

  1. Hello Point——WebGL, http://www.cnblogs.com/idealer3d/p/3513838.html
  2. Professional WebGL Programming: Developing 3D Graphics for the Web,Listing 2-1,http://media.wiley.com/product_ancillary/60/11199688/DOWNLOAD/Listing-2-1.html
  3. WebGL Programming Guide, https://sites.google.com/site/webglbook/

转载请注明出处:http://www.cnblogs.com/opengl/p/7269809.html

原创粉丝点击