shader

渲染管線

gl_Position 頂點在世界坐標(biāo)系中的坐標(biāo)玖绿;
gl_FragCoord 片元在以canvas畫布窗口坐標(biāo)系統(tǒng)中的坐標(biāo)叁巨;默認(rèn)是畫布長和寬, 一般進(jìn)行歸一化后范圍范圍為[0, 1],左下角(0, 0)锋勺,右上角(1, 1)

uniform vec2 u_resolution;
void main() {
    vec2 p = gl_FragCoord.xy / u_resolution;
    gl_FragColor = vec4(p.xy, .0, .1);
}
歸一化

可以將原點移動到中心位置贮勃,此時中心點為(.0, .0)苏章;

uniform vec2 u_resolution;
void main() {
    vec2 p = gl_FragCoord.xy / u_resolution - vec2(.5, .5);
    gl_FragColor = vec4(p.xy, .0, .1);
}
移動原點至中心

gl_PointCoord 點域圖元光柵化的片元布近,即gl_PointSize定義的區(qū)域內(nèi)片元坐標(biāo);區(qū)間 [0撑瞧,1],左上角為(0, 0)订咸,右下角(1, 1)

uniform vec2 u_resolution;
void main() {
    gl_FragColor = vec4(gl_PointCoord, .0, .1);
}
截屏2023-01-09 21.44.53.png

gl_FragCoord與 gl_PointCoord的關(guān)系

關(guān)系

attribute 骆撇、 uniform 父叙、varying存儲限定字

  • 這兩種類型的變量定義在 main函數(shù)外部,并且它們都不能在著色器中被重新賦值涌乳;
  • uniform 是全局的甜癞,在頂點和片元著色器中使用,在著色器程序中是獨一無二的悠咱;
  • attribute 只能用在頂點著色器,表示逐頂點信息躬贡,頂點著色器一個個的獲取頂點信息渡贾;
  • varying 使頂點著色器能夠向片元著色器傳送數(shù)據(jù)雄右,varying 變量從頂點著色器向片元著色器傳遞時會進(jìn)行插值;

initShader

import { createBuffer } from "./createBuffer";

function createProgram(gl: WebGLRenderingContext, vshader: string, fshader: string) {
    const vertexShader = createShader(gl, gl.VERTEX_SHADER, vshader);
    const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fshader);
    /**
     * vertexShader & fragmentShader 為編譯后的中間碼
     */
    if (!vertexShader || !fragmentShader) {
        return null;
    }
    
    const program = gl.createProgram();
    if (!program) {
        return null;
    }

    // 為程序?qū)ο蠓峙涠c著色器和片元著色器
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    // 鏈接program
    gl.linkProgram(program);

    // 檢查連接狀態(tài)
    const linked = gl.getProgramParameter(program, gl.LINK_STATUS);
    if (!linked) {
        const error = gl.getProgramInfoLog(program);
        console.error(`failed to link program: ${error}`);
        gl.deleteProgram(program);
        gl.deleteShader(vertexShader);
        gl.deleteShader(fragmentShader);
        return null;
    }
    return program;
}

function createShader(gl: WebGLRenderingContext, type: number, source: string) {
    const shader = gl.createShader(type);
    if (!shader) {
        return null;
    }
    // 設(shè)置著色器源代碼
    gl.shaderSource(shader, source);

    // 編譯著色器
    gl.compileShader(shader);

    // 檢查編譯狀態(tài)
    const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    if (!compiled) {
        const error = gl.getShaderInfoLog(shader);
        console.error(`failed to compile shader: ${error}`);
        gl.deleteShader(shader);
        return null;
    }
    return shader;
}

export function initShader(gl: WebGLRenderingContext, vshader: string, fshader: string) {
    const program = createProgram(gl, vshader, fshader);
    if (!program) {
        console.log('failed to create program');
        return false;
    }
    gl.useProgram(program);
    return true;
}

VBO vertex buffer object 在GPU顯存上開辟空間存儲模型數(shù)據(jù)囤屹;
VAO vertex array object 記錄VBO的錨定點逢渔;

function createPosition(gl: WebGLRenderingContext, program: WebGLProgram) {
    const data = new Float32Array([
        0.5, 0.5,
        -0.5, 0.5,
        -0.5, -0.5,
        0.5, -0.5
    ]);
    // const data = new Float32Array([.5, .5]);

    //獲取頂點著色器的位置變量apos肃廓,即aposLocation指向apos變量。
    const aposLocation = gl.getAttribLocation(program, 'a_Position');
    // 歸一化
    uniformization(gl, program);
    //創(chuàng)建緩沖區(qū)對象
    var buffer = gl.createBuffer();
    //綁定緩沖區(qū)對象,激活buffer
    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    //頂點數(shù)組data數(shù)據(jù)傳入緩沖區(qū)盲赊,STATIC_DRAW表示靜態(tài)數(shù)據(jù)
    gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
    //緩沖區(qū)中的數(shù)據(jù)按照一定的規(guī)律傳遞給位置變量apos
    gl.vertexAttribPointer(aposLocation, 2, gl.FLOAT, false, 0, 0);

    //允許數(shù)據(jù)傳遞
    gl.enableVertexAttribArray(aposLocation);

    gl.drawArrays(gl.POINTS, 0, 4);
}

reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哀蘑,一起剝皮案震驚了整個濱河市葵第,隨后出現(xiàn)的幾起案子合溺,更是在濱河造成了極大的恐慌,老刑警劉巖棠赛,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛约,死亡現(xiàn)場離奇詭異,居然都是意外死亡痰腮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門棍丐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沧踏,“玉大人,你說我怎么就攤上這事翘狱。” “怎么了阱高?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵茬缩,是天一觀的道長。 經(jīng)常有香客問我凰锡,道長,這世上最難降的妖魔是什么裕膀? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任勇哗,我火速辦了婚禮,結(jié)果婚禮上野揪,老公的妹妹穿的比我還像新娘。我一直安慰自己斯稳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布卧斟。 她就那樣靜靜地躺著憎茂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖幔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天募逞,我揣著相機(jī)與錄音馋评,去河邊找鬼。 笑死留特,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苟蹈。 我是一名探鬼主播市咆,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼再来,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芒篷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挠他,失蹤者是張志新(化名)和其女友劉穎篡帕,沒想到半個月后贸呢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拢军,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年固蛾,在試婚紗的時候發(fā)現(xiàn)自己被綠了度陆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趾诗,死狀恐怖蹬蚁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缚忧,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布糕非,位于F島的核電站球榆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏持钉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一始腾、第九天 我趴在偏房一處隱蔽的房頂上張望空执。 院中可真熱鬧,春花似錦辨绊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冻晤。三九已至,卻和暖如春明也,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绣硝。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工撑刺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人够傍。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓冕屯,卻偏偏與公主長得像寂诱,于是被迫代替她去往敵國和親安聘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容