我正在使用OpenGL的GUI。我正在使用此图像来纹理我的按钮: 调整纹理的一部分,OpenGL
您看不到它,但它周围有一个轻的边框(2像素宽度)。
我想要实现的是具有很好的可调整大小的按钮,它保持边界不变。据这里给我暗示,在计算器上我决定使用9芯模式,所以我分了我的四成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();
请注意,由于内部的颜色渐变,您的纹理不容易进行平铺。你可以尝试从近似(x = 2,y = 20,w = 18,h = 18)中选取一个四边形,并将其平铺以获得更好的效果 – Constantin