2012-12-18 24 views
9

不久前,我在使用紋理邊緣而不是紋理中心時顯示紋理時出現問題。這與線性混合組合給出了顏色的平滑結果,而不是由紋理給出的純色。紋理中心的採樣不會給出正確的結果,OpenGL,C++

感謝這裏給出的建議,我認爲我的問題已經解決了,因爲我開始使用texels中心作爲座標,但它只適用於一種情況,我不知道爲什麼只在這種情況下。

再次我會顯示一些圖片。

這是我使用貼圖(32×32像素)的2個像素邊界:

enter image description here

我正在被抽取的全對象由9輛四輪摩托車,但他們只使用一個紋理(我展示的那個)。其中一人將作爲解釋我的問題:

enter image description here

我覺得這是非常明顯的是那四的顏色不按質地正確設置。

它看起來像混合了問題,但是設置紋理座標我用紋理元素中心,是這樣的:

glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x, pos.y + height - m_borderWidth); 

    // Top left 
    glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x, pos.y + m_borderWidth); 

    // Top right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth); 

    // Bottom right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth); 
glEnd(); 

對於澄清:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0.0625

texelCentersOffset = 1/64 = 0.015625

有人能告訴我我寫的內容有什麼問題嗎?

EDIT1:

這裏是我的紋理設置:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR_MIPMAP_NEAREST); 
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); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_width, m_height, 
        GL_RGBA, GL_UNSIGNED_BYTE, pixmap); 

當我從GL_LINEAR改變GL_NEAREST,它工作正常所以這顯然與混合的問題,但仍然想不通爲什麼它是錯的。

EDIT2:

當我增加四的高度比紋理的高度相同或更大,它工作正常不改變任何紋理座標。

+0

你在哪裏設置你的投影和模型視圖矩陣? 'pos'的價值是什麼? – genpfault

+0

@genpfault pos.x和pos。y是0,所以它們可以省略。 矩陣設置在像這樣的開始處: glViewport(0,0,width,height); //重置當前視口 glMatrixMode(GL_PROJECTION); //選擇投影矩陣 glLoadIdentity(); \t \t \t \t \t \t \t \t \t //重置投影矩陣 \t glOrtho(0.0,寬度,高度,0.0,0.0,1.0); glMatrixMode(GL_MODELVIEW); \t \t \t \t \t \t //選擇模型視圖矩陣 glLoadIdentity(); \t \t \t \t \t \t \t \t \t //重置模型變換矩陣 –

+0

你不應該嘗試分配紋理像素中心的頂點。你真正想要的是texels是否在光柵化之後以結果片段*爲中心。我在這裏寫了一個漂亮的答案(有圖片解釋),也許閱讀這將有助於你理解:http://stackoverflow.com/a/11458037/1236185 – Tim

回答

1

在我看來,當你設置的四倍大小小於紋理的大小。它必須使用mipmap對紋理進行採樣。

Mipmaps是通過平均4 texel塊。所以,當你對mipmap進行採樣時,你可以從多個紋理中獲取信息。所以,通過讓你的四邊形比紋理更小,它必須對一個mipmap進行採樣,並且你得到紋理流血。關閉mipmapping,我的猜測是它會消失。

+0

對不起,很抱歉,這是個問題。謝謝,托克斯! –