我正在使用 OpenGL 开发 GUI。我正在使用这张图片来纹理我的按钮:
你不能很好地看到它,但它周围有一个浅色边框(2 像素宽)。
我想要实现的是拥有可调整大小的按钮,使其边界保持不变。根据这里给我的提示,在 StackOverflow 上我决定使用 9-cell-pattern,所以我将四边形分成 9 个部分,如下所示:
我真的很喜欢我在边界附近实现的效果,但问题在于中心(第 9 个)的四边形:
我想像我一样重复或包裹纹理,但忽略边框。
所以我的问题是 - 有没有办法只用我现在使用的一种纹理来做到这一点?或者我应该创建第二个纹理,它会减少一个边框宽度并用这个纹理在中间渲染这个四边形?
另外我不知道是否有必要,但我在这里放了我的代码片段:
这是我用于平铺/包装纹理的代码:
switch(m_bTiling)
{
case true:
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT );
break;
case false:
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP );
break;
}
这是绘制四边形的代码:
// Top left quad [1]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0f, 1.0-maxTexCoordBorderY);
glVertex2i(pos.x, pos.y + m_borderWidth);
// Top left
glTexCoord2f(0.0f, 1.0);
glVertex2i(pos.x, pos.y);
// Top right
glTexCoord2f(maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + m_borderWidth, pos.y);
// Bottom right
glTexCoord2f(maxTexCoordBorderX, 1.0-maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);
glEnd();
// Top middle quad [2]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(maxTexCoordBorderX, 1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);
// Top left
glTexCoord2f(maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + m_borderWidth, pos.y);
// Top right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + width - m_borderWidth, pos.y);
// Bottom right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, 1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + m_borderWidth);
glEnd();
// Top right quad [3]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(1.0 - maxTexCoordBorderX, 1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + m_borderWidth);
// Top left
glTexCoord2f(1.0 - maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + width - m_borderWidth, pos.y);
// Top right
glTexCoord2f(1.0, 1.0);
glVertex2i(pos.x + width, pos.y);
// Bottom right
glTexCoord2f(1.0, 1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + width, pos.y + m_borderWidth);
glEnd();
// Middle left quad [4]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0, maxTexCoordBorderY);
glVertex2i(pos.x, pos.y + height - m_borderWidth);
// Top left
glTexCoord2f(0.0, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x, pos.y + m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordBorderX, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
glEnd();
// Middle right quad [5]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(1.0 - maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);
// Top left
glTexCoord2f(1.0 - maxTexCoordBorderX, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + m_borderWidth);
// Top right
glTexCoord2f(1.0, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x + width, pos.y + m_borderWidth);
// Bottom right
glTexCoord2f(1.0, maxTexCoordBorderY);
glVertex2i(pos.x + width, pos.y + height - m_borderWidth);
glEnd();
// Bottom left quad [6]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0, 0.0);
glVertex2i(pos.x, pos.y + height);
// Top left
glTexCoord2f(0.0, maxTexCoordBorderY);
glVertex2i(pos.x, pos.y + height - m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordBorderX, 0.0);
glVertex2i(pos.x + m_borderWidth, pos.y + height);
glEnd();
// Bottom middle quad [7]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(maxTexCoordBorderX, 0.0);
glVertex2i(pos.x + m_borderWidth, pos.y + height);
// Top left
glTexCoord2f(maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, 0.0);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height);
glEnd();
// Bottom right quad [8]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(1.0 - maxTexCoordBorderX, 0.0);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height);
// Top left
glTexCoord2f(1.0 - maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);
// Top right
glTexCoord2f(1.0, maxTexCoordBorderY);
glVertex2i(pos.x + width, pos.y + height - m_borderWidth);
// Bottom right
glTexCoord2f(1.0, 0.0);
glVertex2i(pos.x + width, pos.y + height);
glEnd();
// Middle middle quad [9]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
// Top left
glTexCoord2f(maxTexCoordBorderX, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, maxTexCoordHeight - maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordWidth - maxTexCoordBorderX, maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);
glEnd();