Мне ужасно трудно найти способ лучше обрабатывать швы между 3D-мозаичными объектами в моем игровом движке. Вы видите их только тогда, когда камера наклонена под достаточно большим углом, вот так ... Я не верю, что это проблема текстуры или проблема рендеринга текстуры (но я могу ошибаться).
Ниже приведены два снимка экрана: первый демонстрирует проблему, а второй — UV-обертку, которую я использую для тайлов в Blender. Я оставляю место в UV для перекрытия, так что, если текстуру нужно перерисовать во время небольших мип-карт, я все еще должен быть хорош. Я загружаю текстуры со следующими параметрами текстуры:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Мне кажется, что стороны 3D-тайлов слегка прорисовываются, и вы особенно замечаете артефакт из-за угла освещения (направленного), который применяется с этого угла.
Есть ли какие-нибудь приемы или вещи, которые я могу проверить, чтобы устранить этот эффект? Я визуализирую в «слоях», но внутри этих слоев в зависимости от расстояния до камеры (сначала самые дальние). Все эти объекты находятся в одном слое. Благодарим за любую идею!
Если это полезно, это проект для iPhone/iPad с использованием OpenGLES2.0. Я буду рад предоставить любые фрагменты кода — просто дайте мне знать, с чего лучше всего начать.
ОБНОВЛЕНИЕ С ПОМОЩЬЮ ВЕРШИННЫХ/ПИКСЕЛЬНЫХ ШЕЙДЕРОВ И ВЕРШИН МОДЕЛИ
В настоящее время я использую формат PowerVR POD для хранения данных модели, экспортированных из Blender (через Collada, а затем конвертер Collada2Pod от PowerVR). Вот координаты вершины GL_SHORT (пространство модели):
64 -64 32
64 64 32
-64 64 32
-64 -64 32
64 -64 -32
-64 -64 -32
-64 64 -32
64 64 -32
64 -64 32
64 -64 -32
64 64 -32
64 64 32
64 64 32
64 64 -32
-64 64 -32
-64 64 32
-64 64 32
-64 64 -32
-64 -64 -32
-64 -64 32
64 -64 -32
64 -64 32
-64 -64 32
-64 -64 -32
Так что все должно быть идеально гладко, я ожидаю. Вот шейдеры:
attribute highp vec3 inVertex;
attribute highp vec3 inNormal;
attribute highp vec2 inTexCoord;
uniform highp mat4 ProjectionMatrix;
uniform highp mat4 ModelviewMatrix;
uniform highp mat3 ModelviewITMatrix;
uniform highp vec3 LightColor;
uniform highp vec3 LightPosition1;
uniform highp float LightStrength1;
uniform highp float LightStrength2;
uniform highp vec3 LightPosition2;
uniform highp float Shininess;
varying mediump vec2 TexCoord;
varying lowp vec3 DiffuseLight;
varying lowp vec3 SpecularLight;
void main()
{
// transform normal to eye space
highp vec3 normal = normalize(ModelviewITMatrix * inNormal);
// transform vertex position to eye space
highp vec3 ecPosition = vec3(ModelviewMatrix * vec4(inVertex, 1.0));
// initalize light intensity varyings
DiffuseLight = vec3(0.0);
SpecularLight = vec3(0.0);
// Run the directional light
PointLight(true, normal, LightPosition1, ecPosition, LightStrength1);
PointLight(true, normal, LightPosition2, ecPosition, LightStrength2);
// Transform position
gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(inVertex, 1.0);
// Pass through texcoords and filter
TexCoord = inTexCoord;
}