【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

テクスチャの読み込み

OpenGLを使ったプログラムをC++からC#に移植しています(id:n7shi:20091011)。元のプログラムではOpenGLに渡すテクスチャをSDL_imageで読み込んでいます。SDL_imageは依存するDLLが多いため、id:setuna-kanataさんの以下の記事を参考にGDI+で読み込んでみました。

SDL_imageと対比したコードは以下の通りです。【追記】OpenGL ESでのやり方はid:n7shi:20091012を参照してください。

    var id = new uint[1];
    GL.glGenTextures(id.Length, id);
    GL.glBindTexture(GL.GL_TEXTURE_2D, id[0]);
    GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
    GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
#if USE_SDL_IMAGE
    SDL_Surface presurf = SDL.IMG_Load(filename); // 32bpp only
    int w = presurf.w, h = presurf.h;
    GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, w, h, 0,
        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, presurf.pixels);
    SDL.SDL_FreeSurface(presurf);
#else
    var presurf = new Bitmap(filename);
    int w = presurf.Width, h = presurf.Height;
    var bmpData = presurf.LockBits(new Rectangle(0, 0, w, h),
        ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, w, h, 0,
        GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, bmpData.Scan0);
    presurf.UnlockBits(bmpData);
    presurf.Dispose();
#endif

OpenGLSDLは既存のラッパーライブラリを使わずに、必要な関数だけP/Invokeしています。