1

次の問題があります-OpenGLでGUIを作成しています.画面上でドラッグできるウィンドウコンポーネントがあります。通常は次のようになります。

ビューポートの外にその一部が消えるように左に移動しようとしない限り、すべて問題ありません。たとえば、水平スクロールの左ボタンは別のテクスチャであり、ウィンドウを左に移動してボタン全体が消えると、最初のピクセルが消えます。次のように、テクスチャが画面全体に引き伸ばされています。

私のCBackground::draw()方法は次のようになります。

bool CBackground::draw(const CPoint &pos, unsigned int width, unsigned int height)
{
    if(width <= 0 || height <= 0)
        return false;

    GLfloat maxTexCoordWidth = (float)width/m_width;
    GLfloat maxTexCoordHeight = (float)height/m_height;

    glPushMatrix();
        glBindTexture(GL_TEXTURE_2D, m_texture);               // Select Our Texture

        switch(m_rotation)
        {
        case BACKGROUND_ROTATION_0_DG:
            glBegin(GL_QUADS);
                glTexCoord2f(0.0f, maxTexCoordHeight);              glVertex2d(pos.x, pos.y + height);
                glTexCoord2f(0.0f, 0.0f);                           glVertex2d(pos.x, pos.y);
                glTexCoord2f(maxTexCoordWidth, 0.0f);               glVertex2d(pos.x + width, pos.y);
                glTexCoord2f(maxTexCoordWidth, maxTexCoordHeight);  glVertex2d(pos.x + width, pos.y + height);
            glEnd();
        break;
                }
    glPopMatrix();

    return true;
}

直前にそのようなコードを追加しようとしましたglPushMatrix():

if((pos.x <= 0 && pos.x + width <= 0)
     return false;

そのため、この 1 つのピクセルを描画することさえできません (メソッドを で残しますreturn) が、この引き伸ばされたテクスチャを描画します。

4

1 に答える 1

4

あなたのwidthheightは両方とも署名されていません。つまり、このチェックは正確にゼロ以外の値には影響しません。

if(width <= 0 || height <= 0)
    return false;

ほとんどの場合、そうでなければ負になる幅がありますが、変数の符号なしの性質により、ラップアラウンドして非常に大きくなっています。これは、バーが非常に右に伸びているように見える理由を説明します (水平方向に大きな正の値)。

適切な解決策は、幅と高さを署名することです。これにより、この種の問題を防ぐことができます。それ以外の場合は、そのようなチェックを、幅と高さが計算される (すべての場所) に移動する必要があります。結局のところ、signed で表現できる幅と高さを超えるウィンドウを持つことはほとんどありませんint

于 2012-12-10T13:26:05.120 に答える