1

私はDプログラミング言語でSDLとOpenGLを使用して2Dゲームを書いています。現時点では、テクスチャマッピングされたクワッドを画面にレンダリングしようとしているだけです。問題は、テクスチャマッピング部分全体が完全に機能していないように見えることです。テクスチャは明らかに正常に読み込まれますが(ゼロ以外のテクスチャ番号が割り当てられ、glGetErrorがゼロ以外の値を返すことはありません)、クワッドはglColorで設定された最後の色でレンダリングされ、テクスチャは完全に無視されます。

この質問を含め、テクスチャマッピングが失敗する一般的な理由を探しましたが、役に立ちませんでした。ロードされるイメージファイルは64x64で、有効な2の累乗サイズです。

これはDであるため、怖がらないでください。ほぼ完全にCスタイルのSDLおよびOpenGL呼び出しです。

SDL初期化コード:

if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) == -1 ||
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0) == -1)
    throw new Exception("An OpenGL attribute could not be set!");

uint videoFlags = SDL_OPENGL | SDL_HWSURFACE | SDL_ANYFORMAT;

if (threadsPerCPU() > 1)
    videoFlags |= SDL_ASYNCBLIT;

SDL_Surface* screen = SDL_SetVideoMode(800, 600, 32, videoFlags);

if (screen == null)
    throw new Exception("SDL_SetVideoMode failed!");

OpenGL初期化コード:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0., 800, 600, 0., 0., 1.);
glMatrixMode(GL_MODELVIEW);

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_TEXTURE_2D);

glClearColor(0.f, 0.f, 0.f, 0.f);

テクスチャ読み込みコード:

SDL_Surface* s = IMG_Load(toStringz("hello.png"));

if (s == null)
    throw new Exception("Image file could not be loaded!");

uint texFormat;

switch (s.format.BytesPerPixel)
{
case 4:
    texFormat = (s.format.Rmask == 0x000000ff ? GL_RGBA : GL_BGRA);
    break;
case 3:
    texFormat = (s.format.Rmask == 0x000000ff ? GL_RGB : GL_BGR);
    break;
default:
    throw new Exception("Bad pixel format!");
    break;
}

if ((s.w & (s.w - 1)) != 0)
    throw new Exception("Width must be a power of 2!");
if ((s.h & (s.h - 1)) != 0)
    throw new Exception("Height must be a power of 2!");

uint glName;

glGenTextures(1, &glName);

glBindTexture(GL_TEXTURE_2D, glName);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, s.format.BytesPerPixel, s.w, s.h, 0,
    texFormat, GL_UNSIGNED_BYTE, s.pixels);

SDL_FreeSurface(s);

レンダリングコード:

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);
    glColor4ub(255, 255, 255, 255);
    glBindTexture(GL_TEXTURE_2D, glName);
    glTexCoord2i(0, 0); glVertex2i(0, 0);
    glTexCoord2i(1, 0); glVertex2i(64, 0);
    glTexCoord2i(1, 1); glVertex2i(64, 64);
    glTexCoord2i(0, 1); glVertex2i(0, 64);
glEnd();

SDL_GL_SwapBuffers();

私のプログラムは、DのSDLおよびOpenGLバインディングを提供するライブラリであるDerelict2を使用しています。

ここで何がうまくいかないのかについてのアイデアはありますか?

編集:将来の参考のために、これが私の問題の解決策です:

http://www.opengl.org/wiki/Common_Mistakes#Creating_a_Texture

呼び出す前にいくつかのパラメータを設定する必要がありましたglTexImage2D。そうしないと、テクスチャが技術的に不完全でした。その呼び出しの直前に次の4行を追加すると、うまくいきました。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4

4 に答える 4

7

よくある間違いの1つは、不完全なテクスチャを作成/使用することです。ここを参照してください。

あなたのコードは:への呼び出しを示していません

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR/*or GL_NEAREST*/);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR/*or GL_NEAREST*/);

また、ミップマップの作成も表示されません。

問題は、テクスチャが不完全であることに関連している可能性があります。

于 2011-02-02T07:49:23.260 に答える
1

ここでは漠然とした理論です。頂点を時計回りではなく反時計回りに描画してみましたか?

glTexCoord2i(0, 0); glVertex2i(0, 0);
glTexCoord2i(0, 1); glVertex2i(0, 64);
glTexCoord2i(1, 1); glVertex2i(64, 64);
glTexCoord2i(1, 0); glVertex2i(64, 0);
于 2011-02-02T05:20:13.333 に答える
0

glOrtho(0., 800, 600, 0., 0., 1.);paintGL関数にが必要ではありませんか?

于 2011-02-02T05:08:52.553 に答える
0

有効にしてみてくださいGL_COLOR_MATERIAL?私はしばらくの間、固定機能パイプラインを使用していませんが、それで使用できると思います。

于 2011-02-02T06:00:28.403 に答える