В игре, похожей на майнкрафт, я получаю белые края на кубах:
Это гораздо более заметно в более темных текстурах. Текстуры настраиваются так:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Любая помощь?
Ответы:
Есть две возможные причины для этого типа проблемы, в зависимости от того, какая именно это проблема. Я перечислю оба:
1. Вы видите другие цвета от вашей текстуры по краям плитки.
Это выглядит для меня как проблема в данном случае, потому что все краевые пиксели являются одним из трех цветов, которые правдоподобно присутствуют в вашей текстуре: белый, черный и коричневый.
Если вы используете несколько плиточных изображений рядом друг с другом в одной текстуре (текстурном атласе), как я полагаю, вы делаете, это неизбежно. Это происходит потому, что графический процессор не совсем совпадает с интерполяцией по краю треугольника с интерполяцией по текстуре, и вы получаете маленькие кусочки соседней текстуры.
Есть несколько вещей, которые вы можете сделать.
CLAMP[_TO_EDGE]
, но таким образом, который учитывает атласы текстур - ваше использование их не имеет никакого эффекта, потому что большинство ваших краев плитки не на краю текстуры.) Это решение, которое я использую в своей собственной записи в жанре кубики . Я не знаю особых недостатков, кроме того, что он использует больше текстурной памяти.2. Вы видите сквозь промежутки между плитками.
Я не думаю, что это проблема в данном случае, так как сквозь дыры не видно зеленой земли, но я включил ее для полноты картины.
Это может произойти, если вы не предоставляете точно такие же координаты для вершин встречных ребер соседних плиток, что обычно возникает из-за ошибки с плавающей точкой. Например, если у вас есть плитки размером 0,6 и вы вычислили правый край плитки в
x=100
с(100*0.6) + 0.6
, а левый край плитки вx=101
с(100*0.6)
, вы не получите тот же самый ответ, и разница может быть видна как маленькие пятнышки пробелы.Решение состоит в том, чтобы гарантировать, что ваша арифметика последовательна; некоторые способы сделать это:
index*size + size
, а только(index+1)*size
.источник