3

2D テクスチャと Rectangle Texture の両方を描画する関数を作成しようとしています。

2Dのものを完全にうまく描画します。ただし、Rectangle テクスチャを描画すると、完全に白く描画されます。

GLuint LoadImage(std::string ImageTitle, GLenum Target)
{
    Image Img(("Images/" + ImageTitle).c_str());
    std::vector<std::uint8_t> Buffer;
    ImageToBuffer(Buffer, Img);

    GLuint ID;
    glGenTextures(1, &ID);
    glBindTexture(Target, ID);
    glTexParameteri(Target, GL_TEXTURE_WRAP_S, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_WRAP_T, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(Target, 0, GL_RGB, Img.Width(), Img.Height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, Buffer.data());
    return ID;
}

void DrawTexture(GLenum Target, GLuint ID, float X1, float Y1, float X2, float Y2)
{
    GLfloat ViewPort[4];
    glGetFloatv(GL_VIEWPORT, ViewPort);

    glEnable(Target);
    glBindTexture(Target, ID);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0);
        glVertex2f(X1, Y1);

        glTexCoord2f(0, Target == GL_TEXTURE_2D ? 1 : ViewPort[3]);
        glVertex2f(X1, Y2);

        glTexCoord2f(Target == GL_TEXTURE_2D ? 1 : ViewPort[2], Target == GL_TEXTURE_2D ? 1 : ViewPort[3]);
        glVertex2f(X2, Y2);

        glTexCoord2f(Target == GL_TEXTURE_2D ? 1 : ViewPort[2], 0);
        glVertex2f(X2, Y1);
    glEnd();
    glDisable(Target);
}

glTextCoordf(X, Y)また、ViewPort の幅/高さの代わりに、X と Y が 1 の場所を使用してみました。幅/高さを使用してみましたが、まだ何もありません。テクスチャの幅と高さを試しました。Rect も 2D として読み込んでみました。運がない。

何も機能しません:S それでも、Texture2D では何とか機能します。

私はそれを次のように使用します:

GLuint ID = LoadImage("RECT_116.png", GL_TEXTURE_RECTANGLE);

//Do other stuff here..

DrawTexture(GL_TEXTURE_RECTANGLE, ID, X1, Y1, X2, Y2);

失敗しますが、2D テクスチャで実行すると:

GLuint ID = LoadImage("2D_116.png", GL_TEXTURE_2D);

//Do other stuff here..

DrawTexture(GL_TEXTURE_2D, ID, X1, Y1, X2, Y2);

それは動作します..私が間違っていることは何ですか?

4

1 に答える 1

2

http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xmlから

ターゲットが GL_PROXY_TEXTURE_2D、GL_PROXY_TEXTURE_1D_ARRAY、GL_PROXY_TEXTURE_CUBE_MAP、または GL_PROXY_TEXTURE_RECTANGLE の場合、データはデータから読み取られませんが、すべてのテクスチャ イメージの状態が再計算され、一貫性がチェックされ、実装の機能に対してチェックされます。実装が要求されたテクスチャ サイズのテクスチャを処理できない場合、すべてのイメージ ステートを 0 に設定しますが、エラーは生成しません (glGetError を参照)。ミップマップ配列全体を照会するには、1 以上のイメージ配列レベルを使用します。

ターゲットが GL_TEXTURE_2D、GL_TEXTURE_RECTANGLE、または GL_TEXTURE_CUBE_MAP ターゲットの 1 つである場合、データは、型に応じて、符号付きまたは符号なしのバイト、ショート、ロング、または単精度浮動小数点値のシーケンスとしてデータから読み取られます。これらの値は、形式に応じて 1、2、3、または 4 つの値のセットにグループ化され、要素を形成します。各データ バイトは、GL_UNPACK_LSB_FIRST によって決定されるビット順序で、8 つの 1 ビット要素として扱われます (glPixelStore を参照)。

したがって、何らかの理由で整合性のチェックが失敗する可能性があるようです。

GL_TEXTURE_2D または GL_TEXTURE_RECTANGLE に応じて、異なる境界条件を実行しているようです

glTexParameteri(Target, GL_TEXTURE_WRAP_S, 
    Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);

その条件を削除して、状況が変わるかどうかを確認しましたか?

于 2013-06-18T13:45:54.703 に答える