簡體   English   中英

在OpenGL中將紋理映射到頂點

[英]Mapping a texture to vertices in OpenGL

我正在嘗試使用OpenGL渲染紋理化網格。 當前,我的主類的狀態為:

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

vec3d是3D向量的一種實現(沒什么特別的),並且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之間的三重浮點列表。但是,沒有應用顏色。 我閱讀了許多紋理映射的示例,並嘗試這樣做,但是沒有運氣。 有什么想法我做錯了嗎?

從您的評論可以看出,您使用了錯誤的OpenGL功能來實現所需的功能。 紋理化是指通過使用例如uv坐標將2d圖像粘貼到網格上。

您要做的是在每個頂點上指定一種顏色,因此您需要啟用GL_COLOR_ARRAY而不是GL_TEXTURE_COORD_ARRAY並為此使用相應的功能。

另一提示:如果要從頭開始學習OpenGL,則應考慮僅使用現代OpenGL(3.2+)

要回答最后一條評論:

好吧,我從紋理文件中讀取了這些顏色,這就是我的意思。 有沒有辦法使用這樣的數組以彩色顯示我的網格?

是和否:執行此操作時,您極有可能無法獲得預期的結果。 通常,紋理中將有多個像素應映射到一張臉。 使用頂點顏色時,每個頂點只能應用一種顏色值,該值會插值到三角形上。 看看如何將紋理應用於網格,您應該能夠在Internet上找到很多資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM