0

私は最近 wxWidgets (バージョン 2.9.4) を学習しており、OpenGL ウィンドウでテクスチャを正しく動作させるのに問題がありました (ただし、glColor4f は正常に動作します)。

wxImage からテクスチャをロードするなど、wxWidget のチュートリアルに従ってみました。stbi_image を使用してテクスチャを読み込もうとしましたが、何をしてもテクスチャは常に白のままです。私が使用しているコードは次のとおりです。

wxImage* img = new wxImage(wxT("grass.png"));

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

GLubyte *bitmapData=img->GetData();
GLubyte *alphaData=img->GetAlpha();

int bytesPerPixel = img->HasAlpha() ?  4 : 3;
int imageWidth = img->GetWidth();
int imageHeight = img->GetHeight();

int imageSize = imageWidth * imageHeight * bytesPerPixel;
GLubyte *imageData=new GLubyte[imageSize];

int rev_val=imageHeight-1;

for(int y=0; y<imageHeight; y++)
{
    for(int x=0; x<imageWidth; x++)
    {
        imageData[(x+y*imageWidth)*bytesPerPixel+0]=
                bitmapData[( x+(rev_val-y)*imageWidth)*3];

        imageData[(x+y*imageWidth)*bytesPerPixel+1]=
                bitmapData[( x+(rev_val-y)*imageWidth)*3 + 1];

        imageData[(x+y*imageWidth)*bytesPerPixel+2]=
                bitmapData[( x+(rev_val-y)*imageWidth)*3 + 2];

        if(bytesPerPixel==4) imageData[(x+y*imageWidth)*bytesPerPixel+3]=
                alphaData[ x+(rev_val-y)*imageWidth ];
    }
}

glTexImage2D(GL_TEXTURE_2D,
                0,
                bytesPerPixel,
                imageWidth,
                imageHeight,
                0,
                img->HasAlpha() ?  GL_RGBA : GL_RGB,
                GL_UNSIGNED_BYTE,
                imageData);

delete[] imageData;
wxDELETE(img);

return texture;

キャンバス クラスで使用する引数は次のとおりです。

int args[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0 };

私は問題をグーグルで検索し、他の人もそれを抱えていることに気づきましたが、VS2010で適切にビルドされないwxWidgets 2.8に切り替える以外に見つけることができる実際の解決策はないようです(私が使用しているもの) .

必要に応じて他のコードを提供できますが、この問題の根本が何であるかはよくわかりません。

4

2 に答える 2

1

私は通常、これらの行に沿って何かをします:

// define a specialisation of wxGLCanvas

class cMyCanvas: public wxGLCanvas
{
 ...

// in frame constructor, call canvas constructor

cMyCanvas * myCanvas = new cMyCanvas( this );

// show the frame

Show();

// set context current

myCanvas->SetCurrent( context );

// initialize canvas

myCanvas-> initGL();
于 2013-01-04T06:13:15.797 に答える