2010-07-14 132 views
0

我正在嘗試沿任意高度細分的對象(STL導入)的Z軸添加一個簡單的重複陰影漸變(認爲疊層)。OpenGL:GL_TEXTURE_1D麻煩

它主要工作,但我得到一些非常奇怪的面孔,紋理不平行於Z,但旋轉和縮放不同。這些面通常(可能總是)垂直取向,有些相當大。我會認爲垂直的面孔是最容易應用的...所以我目前很難過。

這裏的初始化:

glBindTexture(GL_TEXTURE_1D, _d->textures[0]); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //GL_DECAL); 
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0, 
    GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

而且在使用中:

glEnable(GL_TEXTURE_1D); 
foreach(const STLTriangle& t, _model.triangles()) 
{ 
    glBegin(GL_TRIANGLES); 
    glNormal3f(t.normal[0], t.normal[1], t.normal[2]); 
    glTexCoord1f(fmod(t.v[0][2],1.0)); glVertex3f(t.v[0][0],t.v[0][1],t.v[0][2]); 
    glTexCoord1f(fmod(t.v[1][2],1.0)); glVertex3f(t.v[1][0],t.v[1][1],t.v[1][2]); 
    glTexCoord1f(fmod(t.v[2][2],1.0)); glVertex3f(t.v[2][0],t.v[2][1],t.v[2][2]); 
    glEnd(); 
} 
glDisable(GL_TEXTURE_1D); 

有誰看到一些錯誤,我怎麼回事這件事?

+1

「我得到一些非常奇怪的臉」Screenshots,pleases。 「 」fmod(t.v [0] [2],1.0)「你可能不需要這個。 – SigTerm 2010-07-14 06:37:51

+0

好吧,我曾經認爲GL_REPEAT意味着我不......但是如果我忽略掉fmod(),那麼我會沿着Z軸獲得真正奇怪的紋理線性比例縮放。那裏可能有線索,但我在凌晨1點看不到它。 :) – darron 2010-07-14 13:37:07

回答

2

好的,我解決了它。 fmod()是一個線索。

相反的:

glTexCoord1f(t.v[0][2]); 

我需要沿部分從0到1的標準化Z:(或0〜1 * textureScaleFactor,真的)

glTexCoord1f((t.v[0][2] - bounds.min[2])/range); 

我申請縮放因子到範圍以獲得我想要的紋理密度。

fmod()確實是錯的。如果一個人臉具有最小和最大頂點0和1,那麼您將獲得完整的紋理。然而,如果你得到0和1.1,那麼就變成0.1,並且它在整個臉部上縮放紋理的十分之一。哎呀。我很驚訝它在很多其他面孔上都有效。這就是我不休息和睡覺的原因。 :)

至少在某些時候(與fmod()刪除),我得到一個混淆的效果,使更多似乎是錯誤的,而不是真的。所以,我也將紋理切換到mipmap。來源:

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0, 
    GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

要:

gluBuild1DMipmaps(GL_TEXTURE_1D, GL_RGB, _d->sideImage.width(), GL_BGRA_EXT, 
    GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

即便如此,它仍然在距離走樣。有關如何處理該問題的任何建議?我會玩的mipmap級別,看看我的地方...

+2

您是否將MIN過濾器更改爲mipmapped? – 2010-07-14 18:30:51

+0

啊,就是這樣。我仍然是OpenGL的新手。現在效果很好,謝謝。 – darron 2010-07-14 20:21:23