1. 程式人生 > >Cocos2dx-OpenGL ES2.0教程:紋理貼圖(6)

Cocos2dx-OpenGL ES2.0教程:紋理貼圖(6)

上一篇文章中,我們介紹瞭如何繪製一個立方體,裡面涉及的知識點有VBO(Vertex Buffer Object)、IBO(Index Buffer Object)和MVP(Modile-View-Projection)變換。

本文將在教程4的基礎之上,新增紋理貼圖支援。最後,本文會把紋理貼圖擴充套件至3D立方體上面。

基本方法

當我們把一張圖片載入到記憶體裡面之後,它是不能直接被GPU繪製出來的,紋理貼圖過程如下:

首先,我們為之前的頂點新增紋理座標屬性並傳到vertex shader裡面去,然後把記憶體裡面的紋理傳給GPU,最後,在fragment shader裡面通過取樣器,就可以根據vertex shader傳遞過來的紋理座標把紋理上面的顏色值用插值的方式對映到每一個畫素上去。

接下來,讓我們看看具體怎麼做。

準備紋理座標(紋理座標也叫UV座標)

首先,我們需要修改我們的頂點屬性結構體,新增一個紋理座標屬性(TexCoord):

1
2
3
4
5
typedef struct {
    float Position[2];
    float Color[4];
    float TexCoord[2];
} Vertex;

接下來,需要修改頂點陣列的值,主要就是新增UV座標:

1
2
3
4
5
6
7
Vertex data[] =
  {
      { {-1,-1},{0,1,0,1},{0,1}},
      { {1,-1
},{0,1,0,1},{1,1}},
{ {-1,1},{0,1,0,1},{0,0}}, { {1,1},{0,1,0,1},{1,0}} };

注意,我們的紋理座標的(0,0)點在圖片的左上角,這個與OpenGL裡面的左下角是(0,0)有所區別。所以為了讓我們的圖片顯示正常,我們在指定左下角頂點(-1,-1)的時候,它對應的紋理座標應該是(0,1)。其它的座標點以此類推。

GLuint TexCoordLocation = glGetAttribLocation(glProgram->getProgram(), "a_coord");

glEnableVertexAttribArray

(TexCoordLocation);

    glVertexAttribPointer(TexCoordLocation,

2,

GL_FLOAT,

GL_FALSE,

sizeof(Vertex),

                          (GLvoid*)offsetof(Vertex,TexCoord));


生成紋理

首先,我們在標頭檔案裡面定義一個紋理的控制代碼:

1
GLuint textureId;

然後是生成紋理:

1

textureIdDirector::getInstance()->getTextureCache()->addImage("HelloWorld.png")->getName();

接下來,我需要處理Shader了。

修改Shader

首先,修改vertex shader,新增紋理座標屬性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
attribute vec2 a_position;
attribute vec4 a_color;
attribute vec2 a_coord;

varying vec4 v_fragmentColor;
varying vec2 v_coord;

void main()
{
    gl_Position = CC_MVPMatrix * vec4(a_position.xy,0,1);
    v_fragmentColor = a_color;
    v_coord = a_coord;
}

因為紋理座標最終要傳遞到fragment shader裡面去,所以需要定義一個varing vec2 v_coord變數。

接下來是fragment shader的程式碼:

1
2
3
4
5
6
7
8
9
10
varying vec4 v_fragmentColor;
varying vec2 v_coord;

uniform vec4 u_color;

void main()
{
    gl_FragColor = v_fragmentColor * texture2D(CC_Texture0,v_coord);
}

這邊也定義了一個同樣的varing變數,同時我們看到有一個texture2D函式,它可以通過CC_Texture0這個取樣器和紋理座標(v_coord)計算出對應的顏色值。

修改draw call

在呼叫draw call之前,我們需要繫結紋理。我們只需要在glDrawElements方法之前呼叫下列方法就可以了:

1
GL::bindTexture2D(textureId);

執行結果

texturingtexturing

接下來,我們需要把立方體的六個面都新增這張紋理。

讓立方體不再裸奔

這個過程大部分程式碼都是一樣的,惟一的區別就是頂點陣列的修改,我們需要為每一個面的頂點都指定UV座標:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define TEX_COORD_MAX   1
    Vertex Vertices[] = {
        // Front
        { {1, -1, 0}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}},
        { {1, 1, 0}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
        { {-1, 1, 0}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}},
        { {-1, -1, 0}, {0, 0, 0, 1}, {0, 0}},
        // Back
        { {1, 1, -2}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}},
        { {-1, -1, -2}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
        { {1, -1, -2}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}},
        { {-1, 1, -2}, {0, 0, 0, 1}, {0, 0}},
        // Left
        { {-1, -1, 0}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}},
        { {-1, 1, 0}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
        { {-1, 1, -2}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}},
        { {-1, -1, -2}, {0, 0, 0, 1}, {0, 0}},
        // Right
        { {1, -1, -2}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}},
        { {1, 1, -2}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
        { {1, 1, 0}, {0, 0, 1, 
            
           

相關推薦

Cocos2dx-OpenGL ES2.0教程:紋理(6)

在上一篇文章中,我們介紹瞭如何繪製一個立方體,裡面涉及的知識點有VBO(Vertex Buffer Object)、IBO(Index Buffer Object)和MVP(Modile-View-Projection)變換。 本文將在教程4的基礎之上,新增紋理貼圖支

DirectX9.0 Texture紋理()示例程式

DirectX9.0 Texture紋理對映 將DirectX SDK 上的Texture略微修改,它是一個旋轉的空心圓柱體。我覺得用正方形能更好的理解紋理座標。其實在用遊戲引擎時,是不會關心紋理是如何具體對映的 1.紋理座標 DirectX中的紋理與OpenG

OpenGL中進行多紋理

    int Status=FALSE;        // 狀態指示器     AUX_RGBImageRec *TextureImage[6];      // 建立紋理的儲存空間     memset(TextureImage,0,sizeof(void *)*6);     // 將指標設為 NUL

【一步步學OpenGL 16】 -《紋理

教程16 紋理貼圖基礎 背景 紋理貼圖意思是將任意型別的圖片貼在3d模型的一個或者多個面上。圖片可以是任意的但通常是一種通用的樣式,比如:磚塊、植物、荒蕪的土地等等,可以提高場景的真實性。比較下面兩幅圖片: 為了實現紋理貼圖我們需

android平臺下OpenGL ES 3.0實現2D紋理顯示bitmap

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

2.x終於照著教程,成功使用OpenGL ES 繪製紋理,增加了灰度

在之前成功繪製變色的幾何圖形之後,今天利用Openg ES的可程式設計管線繪製出第一張紋理。學校時候不知道OpenGL的重要性,怕晦澀的語法,沒有跟老師學習OpenGL的環境配置,如今只能利用cocos2dx 2.2.3 配置好的環境學習OpenGL ES。原始碼來自《co

Opengl ES 1.x NDK實例開發之六:紋理

otto absolute decode super rep mit his viewport 一個 開發框架介紹請參見:Opengl ES NDK實例開發之中的一個:搭建開發框架 本章在第三章(Opengl ES 1.x NDK實例開發之三:多邊形的旋轉)的基礎

MFC+OpenGL 紋理後再繪製線條兩個顏色相互影響

    OpenGL渲染方式比GDI+強太多了,所以做繪圖操作時我選擇了OpenGL(新手),但是我在紋理貼圖時出現了這樣一個問題,就是我在貼完圖後再繼續在繪製線條什麼的最後::SwapBuffers(hDC_); glFlush(); 也就是輸出到顯示器時紋理貼圖的顏色竟然

【GLSL教程】(八)紋理

簡單的紋理貼圖(Simple Texture)為了在GLSL中應用紋理,我們需要訪問每個頂點的紋理座標。GLSL中提供了一些屬性變數,每個紋理單元一個: attribute vec4 gl_MultiTexCoord0;

OpenGL ES (3):平面圖形-表面紋理

1.簡介 上一篇已經將一個平面圖形繪製出來了,這一次我們將在上一次繪製出來的圖形的表面上進行紋理貼圖。 圖片準備:(寬高須為2的N次方) 最終圖片是以Bitmap形式。現在考慮如何把這張圖片對映到繪製的平面上? 所以這裡也需要一個數組float[] 用於設定紋理座

OpenGL ES (16): 紋理

1.前言 圖片如下:紋理座標為 左上角為(0,0),右下角為(1,1) 我們繪製一個正方形,頂點座標資料如下: 此次程式碼不包含z軸,預設為0。 要做的事就是把圖片貼到正方形的表面,並繪製出正方形。 所以上面的紋理座標和頂點座標的順序要一致。這樣繪製的圖片才

Opengl es2.0 學習筆記(七)基礎紋理

一.使用紋理過程 使用FreeImage.lib 讀取圖片,獲取調色盤.(windows顏色不是rgb是bgr,此處需要轉換) glGenTextures建立一個紋理控制代碼 gl

Opengl es2.0 學習筆記(五)元裝配

文章目錄二、API三、注意四、虛擬碼 一、圖元型別 #define GL_POINTS 0x0000點 #define GL_LINES 0x0001線 #defi

使用glfw庫將OpenCV讀取到的圖片作為OpenGL的背景紋理

轉載請註明出處:http://my.csdn.NET/ye_shen_wei_mian 前段時間接觸過一點glfw,個人而言不太喜歡freeglut的回撥機制,glfw不失為一個可以替代的選擇。 使用glfw應當注意以下幾點: 1;glfw是可以使用在多執行緒當中使用的。

Android OpenGL ES2.0 繪製多紋理的三稜錐

效果 實現 使用openGL ES 2.0,分別畫出三稜錐的4個面(包括底面),分別給4個面塗上紋理。 著色器 頂點著色器: private final String mVertexShaderWithTexture= "attribute

Android OpenGL ES正方體紋理(每個面一張)

正方體的紋理貼圖步驟如下: 1.陣列 1.1:頂點陣列 1.2:三角形 1.3:貼圖陣列 2.onSurfaceChanged:與3D的一樣 3.onSurfaceCreated:需要新增東西 3.1允許2D貼圖gl.glEnable(GL10.GL_TEXTURE_2D

OpenGL ES 紋理

頂點座標和紋理座標 在沒有投影矩陣的情況下,我們要傳給頂點著色器的座標值都在(-1,1)範圍內,超出了這個範圍將不可見。因此對於一個四邊形的繪製,我們經常看到下面的頂點座標: GLfloat vertices[] = { // P

OpenGL曲面紋理技術--波浪的模擬

{ GLuint  PixelFormat;   // 儲存查詢匹配的結果 WNDCLASS wc;      // 視窗類結構 DWORD  dwExStyle;    // 擴充套件視窗風格 DWORD  dwStyle;    // 視窗風格 RECT  WindowRect;    // 取得矩形的左

Opengl ES 1.x NDK例項開發之六:紋理

本章在第三章(Opengl ES 1.x NDK例項開發之三:多邊形的旋轉)的基礎上演示如何使用紋理貼圖,分別實現了三角形紋理貼圖和正方形紋理貼圖。 【例項講解】 OpenglES要求生成紋理的圖片長寬為2的n次方,支援各種格式(BMP, GIF, JPEG, PNG..

OpenGL著色器程式解析--紋理

背景紋理貼圖意思是將任意型別的圖片貼在3d模型的一個或者多個面上。圖片可以是任意的但通常是一種通用的樣式,比如:磚塊、植物、荒蕪的土地等等,可以提高場景的真實性。比較下面兩幅圖片: 為了實現紋理貼圖我們需要做三件事:將一張貼圖載入到OpenGL中,提供紋理座標和頂點(將紋理對