簡體   English   中英

如何在3D圖形OpenGL中使用紋理

[英]How to use texture in 3d graphic OpenGL

正如湯米所說,我做了一些改變:

因此,我想說的是:

  • 確保所有數組中至少包含11個元素;
  • 啟用紋理。

為什么此代碼不會顯示草的紋理?

首先,加載紋理圖像:

QImage img;
if(!img.load("../g.jpg")){
    qDebug("Texture not found!");
}
else {
    t = QGLWidget::convertToGLFormat(img);
    qDebug("Textture Converted to GLFormat.");
}

然后調用draw方法,該方法應使用頂點數組繪制不平坦的地面:

 GLfloat vertices2[] = {
    2,2,0 , 2,-2,0 , -2,-2,0 , -2,2,0,

    0.7,0.6,0.6 , 0.4,0.9,0.1 , 0.1,0.2,0.3 , 0.8,0.3,0.8 ,

    0.5,-0.5,0.12 , 0,-0.9,0.4 , -0.8,-0.2,0.6
};

GLfloat colors[] = {35 , 73 , 12 , 10 , 6 , 41 , 32 , 10 , 13 , 35 , 42 , 86 , 12 , 2 , 6 ,9};

GLfloat TexCoords[] = {
    0.449,0.911,0.056,
    0.911,0.056,0.17,
    0.056,0.17,0.902,
    0.17,0.902,0.873,
    0.902,0.873,0.061,
    0.873,0.061,0.557,
    0.061,0.557,0.517,
    0.557,0.517,0.131,
    0.517,0.131,0.855,
    0.131,0.855,0.533,
    0.855,0.533,0.896,
    0.533,0.896,0.178,
    0.896,0.178,0.303,
    0.178,0.303,0.358,
    0.303,0.358,0.064,
    0.358,0.064,0.156,
    0.064,0.156,0.199,
    0.156,0.199,0.32,
    0.199,0.32,0.636,
    0.32,0.636,0.306,
    0.636,0.306,0.445,
    0.306,0.445,0.166,
    0.445,0.166,0.572,
    0.166,0.572,0.249,
    0.572,0.249,0.29,
    0.249,0.29,0.389,
    0.29,0.389,0.79,
    0.389,0.79,0.567,
    0.79,0.567,0.692,
    0.567,0.692,0.202,
    0.692,0.202,0.913,
    0.202,0.913,0.498
};

GLfloat NormalP[] = {     0.383,0.29,0.746,
                          0.29,0.746,0.301,
                          0.746,0.301,0.675,
                          0.301,0.675,0.541,
                          0.675,0.541,0.677,
                          0.541,0.677,0.896,
                          0.677,0.896,0.915,
                          0.896,0.915,0.295,
                          0.915,0.295,0.423,
                          0.295,0.423,0.76,
                          0.423,0.76,0.89,
                    };

GLubyte indices[]  = {
    1,2,9 , 9,8,1 , 1,8,7 , 7,1,0 ,
    0,7,4 , 0,4,5 , 0,5,3 , 3,5,6 ,
    3,6,10 , 3,10,2 , 2,10,9 , 9,6,10 ,
    6,5,4 , 6,4,7 , 6,7,8 , 6,8,9
};

GLuint mHandle;
glGenTextures(1, &mHandle);
glBindTexture(GL_TEXTURE_2D, mHandle);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,t.width(),t.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,t.bits());

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glColorPointer(3,GL_FLOAT,0,colors);
glVertexPointer(3, GL_FLOAT, 0, vertices2);
glTexCoordPointer(3,GL_FLOAT,0,TexCoords);
glNormalPointer(GL_FLOAT,0,NormalP);

glDrawElements(GL_TRIANGLES,54, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);

在固定管道中,僅在啟用紋理后才應用紋理化。 您不會顯示對glEnable(GL_TEXTURE_2D)的調用。

話雖這么說,但看起來您的陣列大小可能不正確。

glTexCoordPointer(3,GL_FLOAT,0,TexCoords); ... glDrawElements(GL_TRIANGLES,54, GL_UNSIGNED_BYTE, indices);的凈效果glTexCoordPointer(3,GL_FLOAT,0,TexCoords); ... glDrawElements(GL_TRIANGLES,54, GL_UNSIGNED_BYTE, indices); glTexCoordPointer(3,GL_FLOAT,0,TexCoords); ... glDrawElements(GL_TRIANGLES,54, GL_UNSIGNED_BYTE, indices); 是11套紋理坐標將被讀取TexCoords因為在最大的指數indices10 但是,假設您在3d中指定紋理坐標數組,則其中只有兩個紋理坐標。

因此,我想說的是:

  • 確保所有數組中至少包含11個元素;
  • 啟用紋理。

如果僅使用2d紋理並且對紋理矩陣堆棧不做任何聰明的事情,您可能還想切換到2d提供紋理坐標。

按照jp的說法,這是為什么現在被標記為社區Wiki的公然語:創建新紋理ID后,您也無法綁定它。 OpenGL有點奇怪,因為在顯示列表被證明沒有最初希望的屬性后,紋理ID便被固定住了,因此假設您只有一個紋理,那么即使您也從未綁定過紋理,您就可以不做任何事情而無需生成紋理。 但是,如果您對此有所了解並生成它們,請確保您綁定它們。 生成不會隱式綁定。

另一個問題是您啟用了mipmapping作為采樣參數的一部分:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

但紋理沒有mipmap。 要生成mipmap,請在glTexImage2D()之后添加以下調用:

glGenerateMipmap(GL_TEXTURE_2D);

暫無
暫無

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

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