Я не разработчик IOS, но режимы края, которые вы указали (повторить, зеркало и зажим), - это все графическое оборудование, которое я знаю о поддержке, поэтому я предполагаю, что графические процессоры iPhone/iPad будут похожи.
Если вы можете, сделайте текстуру размером 1 пиксель на каждой границе (например, используйте растровое изображение 126x126 и вставьте его в середину прозрачной текстуры 128x128) и используйте зажим как режим края. Однако это не приведет к резкому краю, поскольку билинейная интерполяция будет продолжаться.
В противном случае вам нужно будет сделать математику самостоятельно, что означает, что если ваш прямоугольник просмотра достигнет границы текстуры, вам нужно будет отрегулировать координаты рендеринга, а не только его текстурные координаты, например.
upperLeftQuad.U = viewRectangle.X/textureWidth;
if(upperLeftQuad.U < 0) {
upperLeftQuad.X += -(upperLeftQuad.U * textureWidth);
upperLeftQuad.U = 0;
}
upperRightQuad.U = (viewRectangle.X + viewRectangle.Width)/textureWidth
if(upperLeftQuad.U > 1) {
upperLeftQuad.X -= (upperLeftQuad.U * textureWidth);
upperLeftQuad.U = 1;
}
Просто для информации: Я работаю с 1024 * 1024 текстуры (первого размера больше, чем экран IPod/iPhone (960 * 640), так как текстуры должен иметь копию экрана –
И GL_CLAMP. недоступно в OpenGL-ES –
Я использовал ваше первое решение. Я перерисовываю текстуру в меньшей текстуре с 1px-границей –