gpt4 book ai didi

c++ - 在 OpenGL 视口(viewport)外绘制时纹理拉伸(stretch)

转载 作者:行者123 更新时间:2023-11-30 02:01:45 26 4
gpt4 key购买 nike

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

一切正常,除非你试图将它向左移动,以便它的一部分消失在视口(viewport)之外 - 例如,水平滚动中的左按钮是一个单独的纹理,当我们将窗口向左移动到如此远以至于整个按钮消失时,然后它的纹理的第一个像素被拉伸(stretch)到整个屏幕,就像这样:

我的 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 留下一个方法),但它仍然绘制这个拉伸(stretch)的纹理。

最佳答案

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

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

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

一个好的解决方案是使宽度和高度有符号,这将防止此类问题。否则,您必须将此类检查移动到计算宽度和高度的(所有位置)。毕竟,您不太可能拥有宽度和高度超出带符号 int 所能表示的窗口。

关于c++ - 在 OpenGL 视口(viewport)外绘制时纹理拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com