1. 程式人生 > >原生webgl基礎學習(一) 引言

原生webgl基礎學習(一) 引言

一.筆者自述       

        對於原生WebGL的學習,相信對於很多搞前端圖形開發的小夥伴的痛點是花了很多時間,卻收效甚微;好在現在存在諸如Three.js、Babylon.js、cesium.js等功能強大和齊全的WebGL第三方庫;有了這些第三方庫,我們可以用更少的程式碼構建出絢麗多彩的網路3D應用;那為什麼我們還要學習原生的WebGL,原生的WebGL對於我們來說意味著什麼?接下來筆者就以自身的學習經歷回答這兩個問題:

        首先,筆者在學習WebGL是做科研課題的需要,剛開始的時候也是很茫然,不知道怎麼學,學了一段時間Three.js,又覺得必須把原生的WebGL學一下,不然不明白Three.js到底是怎麼實現的(強迫症患者哈),於是就學習一段時間的原生WebGL,後來發現用Three.js做科研課題更加合適,裡面提供有各種各樣的功能,不用自己再去寫(ps:如果自己去寫這些功能,我可能畢不了業。。。),於是乎我的Three.js越來越進步,用的越來越熟悉;然而,近期身為即將畢業找工作的我,發現很多崗位都要求具備原生的WebGL開發能力,特別是h5渲染引擎的開發,所以峰迴路轉,我再一次選擇學習原生WebGL,於是便決定把自己的學習經歷和一些例子分享給廣大愛好WebGL開發的道友們,希望我們一起度過原生WebGL的這個劫。

          其次,學習原生的WebGL,意味著我們的底層開發能力更上一層樓,如果你再學習一下計算機圖形學的相關知識,我們也可以自己動手開發自己的渲染引擎,是不是覺得很高大上?尤其當我們掌握了原生WebGL開發的相關知識,回過頭來看哪些第三方庫,一切疑惑自然解開了,正所謂“初聽不知曲中意, 再聽已是曲中人”,你理解了,就自然不會再疑惑它們究竟是怎麼實現的。

二.WebGL開發需要準備什麼

1.WebGL簡介

        關於WebGL的介紹,筆者在很早以前寫過一篇基礎介紹的文章,可以供大家參考:關於WebGL的一些基礎性介紹

2.開發要求

        程式設計軟體:

這裡筆者使用的是WebStorm(看個人習慣,不做強制性要求),由於開發原生WebGL會涉及到著色器的程式設計,Webasatorm提供了一個方便著色器程式碼編寫的外掛:GLSL Support;安裝好這個外掛後,著色器程式碼的關鍵字將會帶上顏色,與普通變數區分,如下圖:

       

要安裝這個外掛,你可以自己到官網下載然後手動新增到webstorm外掛裡面,也可以在webstorm的setting(

設定)>Plugins(外掛)裡面搜尋GLSL Support,安裝即可。

        程式語言:HTML、CSS、JavaScript;其中最為重要的是JavaScript,它是WebGL載體語言,就像C++於OpenGL的重要性一樣,所以一定要具備一定的javascript程式設計基礎。

3.著色器語言:glsl 

         關於著色器語言的介紹,可以參考:著色器介紹;而對於著色器的編寫一般有三種形式,第一種是將著色器程式碼單獨寫在一個檔案,頂點著色器可命名為vShader.glsl, 片元著色器可用命名為Shader.glsl;第二種是將著色器程式碼以字串的形式寫在HTML文件內;第三種是將著色器程式碼解除安裝HTML文件的<script> </script>中間,將其表示為指令碼。本教程用的第三種方法,如下圖:

4.著色器編譯

        關於著色器的編譯可以參考:著色器介紹,筆者在這裡不再講詳細,直接上本教程要用的著色器建立,編譯,連結程式碼,讀者可以根據註釋理解哈,在後面的章節我將講解這個shader.js檔案如何用於建立著、編譯和連結著色器:

//shader.js
//建立著色器
function createShader(gl, type, source) {
    let shader = gl.createShader(type);//建立著色器
    gl.shaderSource(shader, source);//附加著色器原始檔到Shader
    gl.compileShader(shader);//編譯著色器
    let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);//判斷著色器是是否編譯成功
    if(success) {
        return shader;
    } else {
        console.log("著色器建立失敗!");
    }

    console.log(gl.getShaderInfoLog(shader));//獲取著色器資訊
    gl.deleteShader(shader);//刪除著色器
}

//連結著色器程式
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);//判斷著色器是否連結成功
    if(success) {
        return program;
    } else {
        console.log("著色器連結失敗!");
    }

    console.log(gl.getProgramInfoLog(program));
    gl.deleteProgram(program);
}

//初始化著色器
function initShader(gl, vShaderText, fShaderText) {
    let vShader = createShader(gl, gl.VERTEX_SHADER, vShaderText);
    let fShader = createShader(gl, gl.FRAGMENT_SHADER, fShaderText);

    return createProgram(gl, vShader, fShader);
}

希望經過筆者在前面的這麼多介紹,大家對WebGL有一個初步的認識,從下一節開始,將帶領大家進行一些基礎知識的學習和demo的開發。