• WebGL中的第三个小程序(着色器)


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Draw a point</title>
    </head>
    <body onload="main()">
        <canvas id="webgl" width="400" height="400">
    
        </canvas>
    
        <script src="lib/webgl-utils.js"></script>
        <script src="lib/webgl-debug.js"></script>
        <script src="lib/cuon-utils.js"></script>
        <script src="HelloPoint1.js"></script>
    </body>
    </html>
    

      

    var VSHADER_SOURC=
        'void main() {
    '+
        'gl_Position=vec4(0.0,0.0,0.0,1.0);
    '+
        'gl_PointSize=10.0;
    '+
        '}
    ';//GLSL ES语言
    
    var FSHADER_SOURCE=
        'void main(){
    '+
        'gl_FragColor=vec4(1.0,0.0,0.0,1.0);
    '+
        '}
    ';
    
    function main(){
        var canvas=document.getElementById("webgl");
        var gl=getWebGLContext(canvas);
    
        if(!gl)
        {
            console.log("Failed to initialize shaders");
            return;
        }
        
        gl.clearColor(0.0,0.0,0.0,1.0);
        gl.clear(gl);
    
        gl.drawArrays(gl.POINTS,0,1);
    }

    js代码中有两个着色器:顶点着色器和片元着色器(着色器可以让光照上去之后,或者观察着的角度发生变化,对场景的影响)

    着色器程序部分代码会被处理成字符串以换行结束,可以检查错误的行号。

     initialShader()函数执行如下

    将着色器代码从JavaScript传给WebGL的系统,建立着色器,顶点着色器先执行,对gl_position和gl_pointSize复制,然后传入片元着色器,片元着色器再执行。

    WebGL程序包括运行在浏览器中的Javascript和运行在WebGL系统中的着色器程序两部分。

    • 顶点着色器

    GLSE ES是一种强类型语言,必须指明变量类型。

    这里出现了两种float 和vec4两种类型,vect由4个浮点型组成的矢量,一个点是有3个坐标组成的,此处有4个

    叫做齐次坐标,能够提高处理三维数据的效率,(x,y,z,w)表示(x/w,y/w,z/w),如果w趋近于0,则表示点趋向于无穷远,并且有利于使用矩阵乘法

    三维坐标系统中一般使用其次坐标表示顶点的三维坐标。

    • 片元着色器

    片元着色器控制点的颜色

    vec4 gl_FragColor=vec4(1.0,0.0,0.0,1.0)

    • gl.drawArrays(mode,first,count)函数,这个函数会使顶点着色器执行count此

    mode:gl.POINTS,gl.LINES,gl.LINE_STRIP,gl.LINE_LOOP...

    first:从哪个点开始,count用到几个顶点。

    顶点着色器的main函数执行完,片元着色器main()执行将颜色赋值给gl_FragColor,

  • 相关阅读:
    使用相对路径名导入包中子模块
    python中子类使用父类属性
    快速掌握Java8 Stream函数式编程技巧
    灵感来袭,基于Redis的分布式延迟队列(续)
    寻找最长不含有重复字符的子串 示例
    golang学习笔记---函数示例
    golang学习笔记---逐行读取文件示例
    golang学习笔记---int转二进制示例
    golang学习笔记---iota(枚举自增值)
    golang学习笔记 ----container/list包用法
  • 原文地址:https://www.cnblogs.com/1521681359qqcom/p/12526294.html
Copyright © 2020-2023  润新知