まず、私の OpenGL 情報 (実行時に取得しました):
OpenGL バージョン=4.0.10243 互換性プロファイル コンテキスト、ベンダー=ATI Technologies Inc.、レンダラー=AMD Radeon HD 6650M
それで、私が取り組んでいるいくつかのプロジェクトの gui/hud レンダリング システムに取り組んでいて、興味深い問題に遭遇しました。次のコードを使用して、問題なくテクスチャ GL_QUADS を表示できます。
this->m_buffer->openglBindTexture();
SDL::Rect tc( this->m_buffer->getOpenGLTextureCoords() );
glBegin( GL_QUADS );
glColor4fv( (SDL::Color("white")).toGLColor4vf( 1.0 ) );
glTexCoord2f( tc.topleft().x, tc.topleft().y );
glVertex3f( this->boundary().bottomleft().x, this->boundary().bottomleft().y, this->m_z );
glTexCoord2f( tc.topright().x, tc.topright().y );
glVertex3f( this->boundary().bottomright().x, this->boundary().bottomright().y, this->m_z );
glTexCoord2f( tc.bottomright().x, tc.bottomright().y );
glVertex3f( this->boundary().topright().x, this->boundary().topright().y, this->m_z );
glTexCoord2f( tc.bottomleft().x, tc.bottomleft().y );
glVertex3f( this->boundary().topleft().x, this->boundary().topleft().y, this->m_z );
glEnd();
その一部は、SDL+OpenGL に関する独自のラッパー コードを使用しています。誰かがそれで癖を見つけた場合に備えて、これが私のバインディングコードです:
void Surface::openglBindTexture( void )
{
int glerror = 0;
if( !this->m_hastexture ) {
int bpp;
Uint32 Rmask, Gmask, Bmask, Amask;
SDL_PixelFormatEnumToMasks(
SDL_PIXELFORMAT_ABGR8888, &bpp,
&Rmask, &Gmask, &Bmask, &Amask
);
int glw = this->w_pow2();
int glh = this->h_pow2();
/* Create surface that will hold pixels passed into OpenGL. */
SDL_Surface *img_rgba8888 = SDL_CreateRGBSurface(0,
glw, glh, bpp,
Rmask, Gmask, Bmask, Amask
);
SDL_SetSurfaceAlphaMod( this->m_surface, 0xFF );
SDL_SetSurfaceBlendMode( this->m_surface, SDL_BLENDMODE_NONE );
SDL_BlitSurface( this->m_surface, NULL, img_rgba8888, NULL );
glGenTextures( 1, &this->m_texture );
glBindTexture( GL_TEXTURE_2D, this->m_texture );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, glw, glh, 0, GL_RGBA, GL_UNSIGNED_BYTE, img_rgba8888->pixels );
glerror = GLException::glError(); if( glerror != 0 ) throw new GLException( "Surface::openglBindTexture::glTexImage2D", glerror, __FILE__, __LINE__ );
SDL_FreeSurface(img_rgba8888);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering
glerror = GLException::glError();
if( glerror != 0 ) throw new GLException( "Surface::openglBindTexture::Importing raw texture", glerror, __FILE__, __LINE__ );
this->m_hastexture = true;
}
glBindTexture( GL_TEXTURE_2D, this->m_texture );
}
OpenGLで単純な色付きのクワッドを表示するために使用しようとしているコードは次のとおりです。
glBegin( GL_QUADS );
glColor3f( 1.0f, 1.0f, 1.0f );
glVertex3f( this->boundary().topleft().x, this->boundary().topleft().y, this->m_z );
glColor3f( 1.0f, 1.0f, 1.0f );
glVertex3f( this->boundary().topright().x, this->boundary().topright().y, this->m_z );
glColor3f( 1.0f, 1.0f, 1.0f );
glVertex3f( this->boundary().bottomright().x, this->boundary().bottomright().y, this->m_z );
glColor3f( 1.0f, 1.0f, 1.0f );
glVertex3f( this->boundary().bottomleft().x, this->boundary().bottomleft().y, this->m_z );
glEnd();
これでは何も描画されません。問題なくテクスチャクワッドをすべて見ることができるので、私は完全に困惑しています.
編集:私はいくつかの健全性チェックを行い、境界座標はすべて正しく表示されていることに注意してください。
編集 2 : テクスチャ クワッドを実行しないと、うまくいくように見えます。バインディング機能を壊す可能性のある部分を見た人はいますか?