2012-12-02 69 views
0

我有我的第一個簡單的OpenGL程序來使用OpenGL顯示2D圖像。我正在使用基於索引的圖像,呼籲glTexImage2D(.. GL_RGB, ... GL_COLOR_IMAGE...) 這是按預期在ATI卡上工作。 交換到nVidia卡後,我看到一個黑色的四邊形而不是我的圖像。鑑於它在ATI上的工作,我猜代碼基本上是正確的 - 但也許我錯過了一個設置 - 或者卡可能不支持我在做什麼(?!)nVidia openGL無法顯示簡單的COLOR_INDEX紋理

首先設置代碼(I 「M使用Qt順便說一句,所以有可能是某些方面呼籲我失蹤): -

glClearColor(0.1, 0.1, 0.25, 0); // background color 

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);  // 4-byte pixel alignment 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

下面就來設置紋理的代碼: -

GLfloat Greys[256]; 
GLfloat Ones[256]; 
for(int I(0); I < 256; ++I) 
{ 
    Greys[I] = (GLfloat)I/256; 
    Ones[I] = 1.0; 
} 

makeCurrent(); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, Greys); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, Greys); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 256, Ones); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_pImage->size().width(), m_pImage->size().height(), 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, m_pImage->bits()); 

這裏顯示的代碼

glLoadIdentity(); 
// Get the camera in the right place 
glRotatef(180, 1, 0, 0); 
// Apply the Pan(Offset), and Zoom 
glTranslatef(m_Offset.x(), m_Offset.y(), 0); 
glScalef(m_Zoom, m_Zoom, 1); 

// Display the image texture mapped to a rectangle 
glColor3f(1,1,0); 

glEnable(GL_TEXTURE_2D); 
glBegin(GL_QUADS); 
glTexCoord2f(0, 0); glVertex3f(0, 0, 10); 
glTexCoord2f(1, 0); glVertex3f(ImSize.width(), 0, 10); 
glTexCoord2f(1, 1); glVertex3f(ImSize.width(), ImSize.height(), 10); 
glTexCoord2f(0, 1); glVertex3f(0, ImSize.height(), 10); 
glEnd(); 
glDisable(GL_TEXTURE_2D); 

我還使用直接RGB-RGB調用glTexImage2D,在單獨的窗口中以全綵色顯示相同的圖像。所以我相信這些尺寸是可以接受的。

如果我刪除了對glTexImage2D的調用,那麼我會得到一個預期的黃色四邊形。因此我懷疑我的電話設置顏色LUT時遇到問題。

主板是華碩GeForce 210沉默 Windows XP 32位。 nVidia驅動6.14.13.681(9-23-2012),R306.81(分支:r304_70-122)

回答

0

您是否測試過OpenGL錯誤代碼?您可以使用此代碼:https://gist.github.com/4144988 - 關於顏色索引格式?如果驅動程序不支持它,我不會感到驚訝。這些天沒有人使用顏色索引格式。如果要繪製托盤紋理,請將托盤上載到1D RGB紋理中,並將顏色索引圖像上載到單個通道(GL_RED或GL_LUMINANCE,取決於OpenGL版本)2D紋理,並將該值用作托盤紋理的索引。

+0

謝謝datenwolf。我沒有檢查錯誤 - 爲了清晰起見,將它們清除出去(我使用gluErrorString爲我進行翻譯)。但無論如何他們都歸零。 –

+0

是的! 答案是使用 glPixelTransferi(GL_MAP_COLOR,TRUE); glPixelMapfv(GL_PIXEL_MAP_I_TO_R,256,Grays); : 我以爲我試過這個 - 但我認爲我錯誤地嘗試過'glEnable(GL_MAP_COLOR)'或什麼的 - 哪個_did_給我一個錯誤。感謝datenwolf,我再次嘗試重現錯誤,但這次我設法做得更仔細一點。 當然,這段代碼是正確的,nVidia卡的行爲邏輯上,而ATI板的行爲可能不規範,但顯示體面的'未定義'behavour。 –