0

私はこれを検索しましたが、残念ながら私が見つけた唯一の答えは、テクスチャがマップされていないという問題に対処するものです。この場合、テクスチャはマップされていますが、ロードされたサーフェスのようには見えません。

とにかく、2 乗の正方形の画像が必要ないという事実を無視して (まだ適切に調べていません)、サーフェスを 2 乗の次元に拡張するための関数スクリプトと、サイズ変更された画像を格納するための構造を作成しました。表面、表面の古い寸法、およびテクスチャの ID。

私のサーフェスからテクスチャへのコードは次のとおりです (引数は SDL_Surface* surf, antTex* tex です):

tex->w=surf->w;
tex->h=surf->h;
tex->surf=resizeToNearestPow2(surf);
glGenTextures(1, &tex->id);
glBindTexture(GL_TEXTURE_2D, tex->id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->surf->w, tex->surf->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->surf->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, NULL);

antTex 構造体は次のとおりです。

GLuint id;          //Texture ID
int w, h;           //Original Image Size
int rw, rh;         //Resized Canvas Size
SDL_Surface* surf;  //Resized Surface

画像のサイズ変更に関するすべてが正常に機能しているように見えます (結果の画像を確認するために SDL の SDL_SaveBMP 関数を使用しました)。元の画像を読み込むために SDL2_image.h の IMG_Load を使用しました。

GL_BLEND が有効なときにテクスチャがマップされた平面を描画すると、何も表示されません。無効にすると、次のようになります (赤はウィンドウの背景色です)。

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/error_zps03e1e5a1.png

元の画像はこれでした:

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/d_zpsc8b9af6f.png

これは、テクスチャがマップされた平面を描画するための私の関数です (引数は antTex* tex、int x、int y です):

glBindTexture(GL_TEXTURE_2D, tex->id);
int w, h;
w=tex->w;
h=tex->h;
GLfloat tw, th;
th=(GLfloat)tex->h/(GLfloat)tex->rh;
tw=(GLfloat)tex->w/(GLfloat)tex->rw;
glPushMatrix();
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS);
        glNormal3f(0, 0, 1);
        glTexCoord2f(0, th);    glVertex2f(0, h);
        glTexCoord2f(tw, th);   glVertex2f(w, h);
        glTexCoord2f(tw, 0);    glVertex2f(w, 0);
        glTexCoord2f(0, 0);     glVertex2f(0, 0);
    glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, NULL);
4

1 に答える 1

1

glTexCoord2f を使用してクワッドにテクスチャをレンダリングするために渡される u 座標と v 座標に問題があります。

変更する必要があります:

glTexCoord2f(0, th);    glVertex2f(0, h);
glTexCoord2f(tw, th);   glVertex2f(w, h);
glTexCoord2f(tw, 0);    glVertex2f(w, 0);
glTexCoord2f(0, 0);     glVertex2f(0, 0);

の中へ:

glTexCoord2f(0, 1);    glVertex2f(0, h);
glTexCoord2f(1, 1);   glVertex2f(w, h);
glTexCoord2f(1, 0);    glVertex2f(w, 0);
glTexCoord2f(0, 0);     glVertex2f(0, 0);
于 2013-09-22T15:29:38.873 に答える