Я работаю над графическим интерфейсом в OpenGL. Я использую это изображение для текстуры моей кнопки: Измените только часть текстуры, OpenGL
Вы не можете видеть это очень хорошо, но у него есть легкая граница (ширина 2 пикселя) вокруг него.
Я хочу добиться того, чтобы иметь красиво изменяемую размерную кнопку, которая не затрагивает границы. По намеками дал мне здесь, на StackOverflow я решил использовать 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