Android OpenGL20 世界座標系,屏幕座標系,紋理座標系



http://blog.csdn.net/qq_31726827/article/details/51265186這一篇大概介紹了座標系,但是如何應用的呢?並沒有特別說明,下面通過測試Sample來說一下.


第一個想說的:世界座標系,這個座標很容易,opengl 座標原點默認給在屏幕中間,一般3D 頂點參照使用這個座標系,具體參見上面的博客.這裏介紹一下着色是如何進行的,工程代碼參照上一篇的代碼:

private float vertexs[]={
            0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,
            0.0f,1.0f,0.0f
    };

    private float colors[]={
            1.0f,0.0f,0.0f,1.0f,//R,G,B,A
            0.0f,1.0f,0.0f,1.0f,
            0.0f,0.0f,1.0f,1.0f
    };

上面給出頂點座標和着色顏色.下面來看看它的具體使用:

mPositionHandle=GLES20.glGetAttribLocation(mProgram,"a_Position");
        GLES20.glVertexAttribPointer(mPositionHandle,3,GLES20.GL_FLOAT,false,0,vertexsBuffer);
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        mColorHandle=GLES20.glGetAttribLocation(mProgram,"a_Color");
        GLES20.glVertexAttribPointer(mColorHandle,4,GLES20.GL_FLOAT,false,0,colorsBuffer);
        GLES20.glEnableVertexAttribArray(mColorHandle);


其中第二行代碼方法的第二參數爲3:代表使用3爲座標系(即x,y,z軸),但是很多地方可能是4維或者5維的,那麼座標即5個參數表示一個座標點,上面的代碼片段是3個參數代表一個端點.

然後在看看第六行方法的第二個參數爲4,那麼即表示着到一個端點上面的顏色值是通過4個參數設定的,比如代碼片段爲(R,G,B,A),讀者可以將參數設置成3看看(效果可能是一樣的).

着色一般和端點一一對應的,即vertexs[0]的顏色是colors[0],但是這個前提是隻畫點的情況,如果是畫線,就有一點不一樣了,當然線兩端的端點顏色仍然對應colors對應點,但是線是連續的,所以兩點之間的顏色如何呢?如果線是vertexs[0]和vertexs[1]對應的colors[0]和colors[1],那麼如果colors[0]和colors[1]顏色一樣(比如紅色),很好說,那麼直線顏色就一種,如果顏色不一樣,比如colors[0]是紅色,colors[1]是綠色,那麼連線一端是紅色,一端是綠色,連線過程就是紅色到綠色的過度漸進色了.如果是畫面的話,那麼面的顏色同樣將會顯示漸進色.


第二個屏幕座標系,這個在opengl似乎很少用.

第三個紋理座標系:加入頂點座標如下,紋理座標如下:

private float vertexs[]={
            0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,
            0.0f,1.0f,0.0f
    };
private float textureCoords[]={
            /*0,0,
            1,0,
            0,1*/
            0,1,
            1,0,
            0,0
    };


那麼紋理使用的圖片(假如是圖片)和vertexs座標對應:

將標有數字1,2,3(帶圈)的和右邊紋理座標a,b,c,d,但是我們只有3個頂點,但是沒關係,將需要的紋理的部分映射到斷點上,比如上一篇文章就是1->b,2->d,3->a,這樣就會發現其實就是將紋理按照點對點貼上去的,當然也可以不一定是頂點對頂點,也可以是頂點對紋理座標區域任何座標位置.

這個可以參考上面的座標,自行修改座標位置,就會發現各種紋理貼圖效果了.

比如按照上面的設置顯示效果如下:


比如反轉顯示:

private float textureCoords[]={
            /*0,0,
            1,0,
            0,1*/
            /*0,1,
            1,0,
            0,0*/
            1,1,
            0,1,
            0,0
    };


再比如倒立:

private float textureCoords[]={

            0,0,
            1,0,
            1,1
            
    };

效果如下:


主要是發覺他們的對應關係:(下面的圖,用對應線連接,對應上面的倒立關係)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章