0

OpenGLを使用して2D画像を表示する最初の簡単なOpenGLプログラムがあります。私はインデックスベースのイメージを使用しており、glTexImage2D(.. GL_RGB, ... GL_COLOR_IMAGE...) これは ATI カードで期待どおりに機能しています。nVidia カードに交換すると、画像の代わりに黒いクワッドが表示されます。ATIで動作することを考えると、コードは基本的に正しいと思います-しかし、設定を見逃している可能性があります-または、カードが私が行っていることをサポートしていない可能性があります(?!)

最初にセットアップ コード (私は 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);

また、glTexImage2D への直接の RGB - RGB 呼び出しを使用して、同じ画像を別のウィンドウにフルカラーで表示します。したがって、寸法は許容範囲内であると確信しています。

glTexImage2D への呼び出しを削除すると、期待どおりに黄色のクワッドが表示されます。したがって、カラー LUT を設定するための呼び出しに問題があると思われます。

ボードは ASUS GeForce 210 サイレント Windows XP 32 ビットです。nVidia ドライバー 6.14.13.681 (2012 年 9 月 23 日)、R306.81 (ブランチ: r304_70-122)

4

1 に答える 1

0

OpenGL エラー コードをテストしましたか? このコードを使用できます: https://gist.github.com/4144988 – カラー インデックス形式について? 単にドライバーがサポートしていなくても不思議ではありません。最近では誰もカラー インデックス形式を使用していません。パレット テクスチャを描画する場合は、パレットを 1D RGB テクスチャにアップロードし、カラー インデックス付きイメージを単一チャネル (OpenGL バージョンに応じて GL_RED または GL_LUMINANCE) 2D テクスチャにアップロードし、その値をパレット テクスチャへのインデックスとして使用します。

于 2012-12-02T20:30:00.837 に答える