2014-11-04 105 views
1

我正嘗試使用OpenGL渲染紋理網格。目前,我的主要類持有包括一個狀態:將紋理映射到OpenGL中的頂點

  • std::vector<vec3d> vertices
  • std::vector<face> mesh
  • std::vector<vec3d> colors

vec3d是三維向量的實現 - face和一類抱着3個整數 - 沒有什麼特別的指向vertices中頂點的索引。

到目前爲止,我變得我不網格紋理用下面的代碼(工作正常):

glShadeModel(params.smooth ? GL_SMOOTH : GL_FLAT); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

/*This is my attempt to add the texture 
* 
*if (_colors.size() != 0) { 
* cout << "Hello" << endl; 
* glClientActiveTexture(GL_TEXTURE0); 
* glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
* glTexCoordPointer(3,GL_FLOAT,0,&_colors[0].x); 
}*/ 
glNormalPointer(GL_FLOAT,0,&normals[0].x); 
glVertexPointer(3,GL_FLOAT,0,&vertices[0].x); 

glDrawElements(GL_TRIANGLES,mesh.size()*3,GL_UNSIGNED_INT,&mesh[0].v1); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

我的紋理存儲在colors作爲花車的三元0和1之間的列表。然而,顏色不適用。我讀了很多紋理映射的例子,並試圖做同樣的事情,但沒有運氣。任何想法我做錯了什麼?

+0

爲什麼你有3D紋理座標?當你使用2D紋理時,你還需要2D座標。 – BDL 2014-11-04 16:09:16

+0

我的數組包含每個頂點的(R,G,B)顏色。 'colors [i]'表示顏色或'頂點[i]'。 – Dici 2014-11-04 16:10:13

+0

然後你根本沒有使用紋理。你使用的是頂點顏色。 – BDL 2014-11-04 16:20:50

回答

1

從您的評論中可以看出,您正在使用錯誤的OpenGL功能來實現您想要的功能。紋理化是指通過使用例如將二維圖像粘貼到網格上。 UV座標。

你在做什麼是指定每個頂點的顏色,所以您將需要啓用GL_COLOR_ARRAY代替GL_TEXTURE_COORD_ARRAY,並使用相應的功能這一點。

一個額外的提示:如果你是從頭開始學習OpenGL的,你應該考慮使用唯一的現代的OpenGL(3.2+)

回答最後一個評論:

嗯,我看從這些顏色紋理文件,這就是我的意思。有沒有辦法使用這樣的數組來顯示我的網格顏色?

是和否:當你這樣做時,你很可能不會得到你期望的結果。一般來說,紋理中會有多個像素應映射到一個面。使用頂點顏色,您只能在每個頂點上應用一個顏色值,並在三角形上插值。看看如何將紋理應用到網格上,你應該能夠在互聯網上找到很多資源。

+0

是的,OP應該嘗試並堅持核心配置文件。 – Robinson 2014-11-04 16:26:58

+0

我曾經在這篇博客上發過一篇文章http://kos.gd/2012/11/dont-use-old-opengl/ – Kos 2014-11-04 16:28:25

+0

實際上,我在一臺無法安裝新庫的計算機上工作,因此無法輕鬆讀取png圖像。然後,我用Java打開圖像並修改'.obj'文件,用相關的顏色替換u-v座標。我只是將GL_TEXTURE_COORD_ARRAy更改爲GL_COLOR_ARRAY並使用了'glCoordPointer',但它仍然不起作用。 – Dici 2014-11-04 16:35:10