ゲーム エンジンで 3D タイル オブジェクト間の継ぎ目をより適切に処理する方法を見つけるのに苦労しています。カメラがこのように十分な角度で下に傾けられた場合にのみ、それらが表示されます...テクスチャの問題またはテクスチャレンダリングの問題ではないと思います(ただし、間違っている可能性があります)。
以下に 2 つのスクリーンショットを示します。最初のスクリーンショットは問題を示し、2 番目のスクリーンショットは Blender でタイルに使用している UV ラッピングです。小さいミップマップでテクスチャをオーバードローする必要がある場合でも、うまくいくように、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 タイルの側面がわずかに描かれているように見えます。特に、この角度から適用されている照明角度 (指向性) によるアーティファクトに気付きます。
この影響を排除するためにチェックできるトリックやものはありますか? 「レイヤー」でレンダリングしていますが、カメラの距離に基づいてそれらのレイヤー内でレンダリングしています(最初に遠い)。これらのオブジェクトはすべて同じレイヤーにあります。どんなアイデアでも大歓迎です!
役に立ったら、これは 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;
}