最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 学习 WebGL(1) - 使用着色器

    正文概述 掘金(leochen)   2021-02-13   386

    着色器的变量

    着色器语言是一种强类型的语言,在声明一个变量时必须要明确指出变量的类型,基本格式为 <类型> <变量名>

    着色器中的变量类型主要分为:

    1. 基本类型 ( float, int, bool )
    2. 矢量类型 ( vec2, vec3, vec4, ivec2, ivec3, ivec4, bvec2, bvec3, bvec4 )
    3. 矩阵类型 ( mat2, mat3, mat4 )

    想要创建对应类型的变量,只需调用着色器也内置的函数即可。比如 vec3 函数可以创建 vec3 类型的变量。

    使用着色器

    前面一章中我们虽然写了一个 WebGL 程序,但是并没有用到着色器。接下来我们画一个点以此来介绍如何使用着色器。

    获取 canvas 和 WebGL 上下文

    let canvas = document.querySelector("#canvas");
    
    function getContext(canvas) {
        let contextNames = ["webgl", "experminal-webgl"];
        for (let i=0; i<contextNames.length; i++) {
            let contextName = contextNames[i];
            let gl = canvas.getContext(contextName);
            if (gl) {
                return gl
            }
        }
    }
    
    let gl = getContext(canvas)
    

    创建着色器源码

    我们使用模板字符串的方式创建着色器代码。内置的变量 gl_Positionvec3 类型,也就是三维向量。内置的变量 gl_FragColorvec4 类型,也就是四维向量,四个分量分别代表了 R, G, B, Alpha。

    // 顶点着色器中将顶点的位置设在原点处,即坐标为 (0, 0, 0),然后将顶点的大小设为 10,方便观察
    let vertexShaderSource = `
    	void main() {
    		gl_Position = vec3( 0.0, 0.0, 0.0 );
    		gl_PointSize = 10.0;
    	}
    `
    
    // 片元着色器中将像素的颜色设为红色
    let fragmentShaderSource = `
    	void main() {
    		gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
    	}
    `
    

    这里可以修改顶点着色器中的 gl_Position,来观察顶点的绘制位置,如果将 x 改为 0.5,那么顶点将出现在靠右侧四分之一处,这里也是验证了 WebGL 的坐标系方向和范围。

    创建 shader

    我们需要先创建着色器对象,然后将着色器源码传给这个对象,并编译着色器代码。

    function createShader(gl, type, source) {
        // 创建着色器对象
        let shader = gl.createShader(type);
        // 向着色器对象填充着色器程序源码
        gl.shaderSource(shader, source);
        // 编译着色器
        gl.compileShader(shader);
        let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
        if (success) {
            return shader
        }
    }
    
    let vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
    let fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
    

    创建 program

    这里要创建一个程序,将编译后的着色器分配给这个程序,然后链接程序对象,并告诉 WebGL 使用这个程序对象。

    function createProgram(gl, vertexShader, fragmentShader) {
        // 创建程序对象
        let program = gl.createProgram();
        // 为程序对象分配着色器
        gl.attachShader(program, vertexShader);
        gl.attachShader(program, fragmentShader);
        // 连接程序对象
        gl.linkProgram(program);
        let success = gl.getProgramParameter(program, gl.LINK_STATUS);
        ig (success) {
            return program
        }
    }
    
    let program = createProgram(gl, vertexShader, fragmentShader);
    // 使用程序对象
    gl.useProgram(program)
    

    清空 canvas

    gl.clearColor(0, 0, 0, 1);
    gl.clear(gl.COLOR_BUFFER_BIT)
    

    绘制

    告诉 WebGL 我们以点的方式进行绘制,至此黑色背景的 canvas 中心点会出现一个红色的点。

    gl.drawArrays(gl.POINTS, 0, 1)
    

    学习 WebGL(1) - 使用着色器 完整示例代码在 github learn-webgl


    起源地下载网 » 学习 WebGL(1) - 使用着色器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元