天天看點

gl attribute和uniform的用法

gl attribute和uniform的用法

attribute

    attribute變量是隻能在vertex shader中使用的變量。(它不能在fragment shader中聲明attribute變量,也不能被fragment shader中使用)

    一般用attribute變量來表示一些頂點的資料,如:頂點坐标,法線,紋理坐标,頂點顔色等

    在application中,一般用函數glBindAttribLocation()來綁定每個attribute變量的位置,然後用函數glVertexAttribPointer()為每個attribute變量指派。

    glsl裡面定義屬性

    Line 16:     attribute vec3 aVertexPosition;

    Line 22:         gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

    javascript使用屬性

        shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");

    Line 97:         gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

    Line 153:         gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

    Line 160:         gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

uniform

    uniform變量就像是C語言裡面的常量(const ),它不能被shader程式修改。(shader隻能用,不能改)

    如果uniform變量在vertex和fragment兩者之間聲明方式完全一樣,則它可以在vertex和fragment共享使用。(相當于一個被vertex和fragment shader共享的全局變量)

    uniform變量一般用來表示:變換矩陣,材質,光照參數和顔色等資訊。

    glsl裡

    Line 18:     uniform mat4 uMVMatrix;

    javascript裡

    Line 100:         shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");

    Line 109:         gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);

繼續閱讀