我很难找到一种方法来更好地处理我的游戏引擎中 3D 平铺对象之间的接缝。只有当相机像这样以足够远的角度向下倾斜时,您才能看到它们……我不认为这是纹理问题或纹理渲染问题(但我可能是错的)。
下面是两个屏幕截图 - 第一个演示了问题,而第二个是我在 Blender 中用于瓷砖的 UV 包裹。我在 UV 中为重叠提供了空间,这样如果纹理需要在较小的 mip-map 期间过度绘制,我应该仍然很好。我正在使用以下纹理参数加载纹理:
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 瓷砖的侧面略微被绘制,并且您特别注意到由于从该角度应用的照明角度(定向)而产生的伪影。
我可以检查任何技巧或东西来消除这种影响吗?我在“图层”中渲染,但在这些图层中基于相机距离(最远的第一)。所有这些对象都在同一层中。任何想法将不胜感激!
如果有用,这是一个使用 OpenGLES2.0 的 iPhone/iPad 项目。我很乐意提供任何代码片段 - 让我知道可能是一个好的起点。
使用顶点/像素着色器和模型顶点进行更新
目前,我正在使用 PowerVR 的 POD 格式来存储从 Blender 导出的模型数据(通过 Collada,然后是 PowerVR 的 Collada2Pod 转换器)。这是 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;
}