2012-08-16 132 views
2

所以基本上我正在用opengl/C++製作2D遊戲。我有一個紋理映射到它的四邊形,因爲我不能使用兩個圖像的非功率(或至少我不應該)我有一個圖像在兩個圖像的力量,我希望通過紋理映射去除多餘的圖像。OpenGL Y紋理座標表現奇怪

GLfloat quadTexcoords[] = { 
    0.0, 0.0, 
    0.78125, 0.0, 
    0.78125, 0.8789, 
    0.0, 0.8789 
}; 
glGenBuffers(1, &VBO_texcoords); 
glBindBuffer(GL_ARRAY_BUFFER, VBO_texcoords); 
glBufferData(GL_ARRAY_BUFFER, sizeof(quadTexcoords), quadTexcoords, GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

這是我的紋理代碼。我知道沒有什麼特別的X座標(0.7256)可以正常工作,並可以刪除圖像右側的多餘圖像。但Y座標不起作用。我調試了我的遊戲,發現正確的座標發送到着色器,但它不會映射。它似乎有時反過來工作,但它是非常不清楚的。

如果我給它一個像Y的座標20,它會重複多次,但仍然會在四方形的頂部留下一條小白線。我沒有想到它會是什麼。

其他細節:我試圖映射的圖像是800乘450,並且它被包裹在一個尺寸爲1024×512的圖像中。我將800的縱橫比縮放爲450.我懷疑這會使差異,但你永遠不知道!

謝謝你的時間。

編輯:這是一個什麼發生的例子。

enter image description here

這是完整的圖像(在X和Y 0到1)充分映射的藍色部分是200個像素高,完整圖像是300個像素高。

enter image description here

第二圖像是(Y中即0〜0.6666)映射到Y軸上的三分之二的圖像。這應該刪除頂部的白色,但這不是發生的事情。我不認爲這些座標是前面的,因爲我在網上獲得了幾個教程的映射。

+1

定義「不起作用」。 *究竟*發生了什麼?紋理的分辨率是多少? – 2012-08-16 15:48:10

+0

你知道OpenGL的座標是從**左下角(不是上)開始的,並且Y座標隨着你的增加而增加嗎?所以'(0.0,0.0)'=左下,'(0.0,1.0)'=左上。我這樣說是因爲你提到「逆向工作」。如果你正在翻轉紋理的y座標,可能會發生奇怪的事情。 – KillianDS 2012-08-16 16:00:39

+0

我知道它從左下角開始,我已經解釋了這一點。你可以看到上面座標的順序。告訴我你的想法 – Constan7ine 2012-08-16 16:13:48

回答

2

它似乎有時反向工作,但它是非常不清楚。

OpenGL假定左下方的視口原點以及在S方向上運行「平面內存texel值」,然後沿T方向運行的紋理座標。實際上,這意味着,使用其中一種通常的映射,紋理的起源在左邊的下部,與大多數圖像處理程序中發現的左上角相反。

所以在你的情況下,你看到的白色邊緣只是你可能應用到底部紋理圖像的填充,而不是頂部,你應該放在哪裏。爲什麼你不能使用NPO2紋理?他們得到廣泛支持。

+0

我可以但我想這種方式工作,因爲我可以用它來製作一個spritesheet系統 – Constan7ine 2012-08-16 20:54:15

+0

嘿有效!謝謝 – Constan7ine 2012-08-16 21:02:26

0

沒有真正解決您的問題,但也許去解決問題的方式:

您可以將圖像擴展到1024×1024(其變形的圖像),並使用0-> 1紋理座標。由於您的四邊形的寬高比爲800x450,因此圖像應正確顯示。

+0

好主意,但我仍然需要解決老問題,因爲我打算使用精靈表 – Constan7ine 2012-08-16 17:19:11