1

我遇到了以下问题 - 我正在 OpenGL 中创建一个 GUI,我有一个可以在屏幕上拖动的 Window 组件。通常它看起来像这样:

一切都很好,除非您尝试将其向左移动以使其部分消失在视口之外 - 例如,水平滚动中的左按钮是一个单独的纹理,当我们将 Window 向左移动时,整个按钮消失,然后是第一个像素它的纹理在整个屏幕上被拉伸,像这样:

我的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;

所以它甚至不应该绘制这个像素(我要留下一个方法return),但它仍然会绘制这个拉伸的纹理。

4

1 回答 1

4

你的widthheight都是无符号的,这意味着这个检查对除零以外的值没有影响:

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

最有可能的是,你有一些宽度,否则它会是负数,但由于你的变量的无符号性质,它会环绕并变得非常大。这可以解释为什么您似乎有一个向右延伸很远的条(水平维度中的大正值)。

一个好的解决方案是对宽度和高度进行签名,这样可以防止此类问题。否则,您必须将此类检查移动到计算宽度和高度的(所有位置)。毕竟,您不可能有一个宽度和高度超出有符号int.

于 2012-12-10T13:26:05.120 回答