zoukankan      html  css  js  c++  java
  • WebGL画点程序v2

    本文程序实现画一个点的任务,如下图。其中,点的位置坐标由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;
    ' + // attribute variable
          'void main() {
    ' +
          '  gl_Position = a_Position;
    ' +
          '  gl_PointSize = 10.0;
    ' +
          '}
    '; 
        
        //片元着色器程序
        var fragmentShaderSource = 
          'void main(){ 
    ' +
          '    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    ' + //gl_FragColor指定像素的颜色
          '} 
    ';                                         
         
      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

  • 相关阅读:
    Jupyter notebook中的Cell and Line Magics
    numpy中array数组对象的储存方式(n,1)和(n,)的区别
    机器学习中的标准化方法(Normalization Methods)
    matplotlib添加子图(拼图功能)
    matplotlib.pyplot.plot详解
    一行代码让你的python运行速度提高100倍
    一个简单的Shell脚本(解决windows上文本在macos上乱码问题)
    解决Mac上打开txt文件乱码问题
    LaTeX中常用代码段snippets(持续更新)
    LaTeX实时预览中文
  • 原文地址:https://www.cnblogs.com/opengl/p/7269809.html
Copyright © 2011-2022 走看看