2013-12-12 69 views
0

我有紋理128 x 128像素24位BMP文件。這是一條垂直線的綠色廣場。它用stbi_image加載OK。在初始化啓用OpenGL紋理不起作用,因爲它應該

glEnable(GL_TEXTURE_2D); 
glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

和紋理參數

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

我有與立方體和圓柱(和一些多邊形頂點帶)製成的對象。我綁定紋理一個像這樣過剩

glPushMatrix(); 
glBindTexture(GL_TEXTURE_2D, tex1_id); 
glColor3f(0.0f, 1.0f, 0.0f); 
glTranslatef(-0.5f, 0.2f, 0.05f); 
glScalef(2.4f, 0.4f, 1.0f); 
glutSolidCube(0.6f); 
glBindTexture(GL_TEXTURE_2D, 0); 
glPopMatrix(); 

頂點方:

glPushMatrix(); 
glTranslatef(-0.03f, 1.26f, -0.35f); 
glRotatef(94, 1.0f, 0, 0); 
glBindTexture(GL_TEXTURE_2D, tex1); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 0.0f); 
glVertex3f(-0.3f, 0.4f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); 
glVertex3f(-0.3f, 0.85f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); 
glVertex3f(0.3f, 0.85f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); 
glVertex3f(0.3f, 0.4f, 0.0f); 
glEnd(); 
glBindTexture(GL_TEXTURE_2D, 0); 
glPopMatrix(); 

我知道glutSolidCube不generete紋理座標,但顯然與上glEnables它工作得精細。所以紋理顯示在對象上。一切看起來都很好。

問題在我用lookAt更改視圖時開始,或者我在一些路徑中翻譯和旋轉對象。然後它看起來像紋理不會隨對象移動和旋轉,而是保持靜態。

Problem 第一:初始視圖;第二:稍微旋轉的看法(lookAt);第三種:稍微翻譯的對象

如果我將使用頂點繪製該對象,則會發生同樣的事情。我在C++中使用OpenGL 2.1。

+1

我相信你自己發現了這個問題。沒有紋理座標,它怎麼可能將頂點映射到紋理中的一個點? – Dave

+0

@Dave我希望有一些神奇的方式可以讓它成爲可能。立方體很容易實現,所以我更關心實體圓柱體的實現。如果我執行glutSolidCylinder並在其中添加一些紋理座標,它會起作用嗎? –

回答

0

你在做錯誤的方式。你必須定義紋理座標。 通過自己給出頂點和紋理座標繪製立方體。

//first face of cube 
glTexCoord2f(0.0, 0.0); 
glVertex3f(x, y, z); 
glTexCoord2f(1.0, 0.0); 
glVertex3f(x, y, z); 
glTexCoord2f(1.0, 1.0); 
glVertex3f(x, y, z); 
glTexCoord2f(0.0, 1.0); 
glVertex3f(x, y, z); 

//and so on for all six face of cube. 

您必須瞭解紋理座標的工作原理。 現在,如果您想繪製圓柱體,請使用gluCylinder函數查看here瞭解詳細信息。您可以使用gluCylinder通過使用gluQuadricTexture函數來渲染使用圓柱體渲染的紋理。我假設您已經加載了紋理。

//Create the quadric object to render cylinder 
GLUquadric *quad; 
quad = gluNewQuadric(); 


glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, _textureId); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gluQuadricTexture(quad,1); 
gluCylinder(quad,2,2,3,20,20); 

你可以找到類似的例子here

+0

也許我沒有描述我的問題,所以我更新了我的問題。具有頂點和添加紋理座標的方式不起作用。 –

+0

glutSolidCube是真正的問題。它不會生成紋理座標,因此如果您翻譯或旋轉立方體紋理,將不會用立方體翻譯,而是映射到不同的位置。 –

+0

我知道,我還修改了glutSolidCube的原始功能,並在那裏添加了紋理座標。沒有效果。即使我繪製4個頂點和紋理座標的簡單正方形,它也不起作用。 –