1

このチュートリアルに従って、3dsモデルローダーを実装しました。現在、私のプログラムはVAOを使用して物事を表示します。これは、これまでのところ、単純な立方体とタイルで機能しました。テクスチャが正しく表示されていました。

ただし、3DSモデルをVAOにロードすると、別の方法になります。モデルは頂点に関しては正しいように見えますが、テクスチャは何らかの理由でY軸に沿ってミラーリングされています。

これは私がUVを読む方法です:

case 0x4140:

qty = reader.ReadUInt16();        // 2 bytes

UV[] texcoords = new UV[qty];

for (i = 0; i < qty; i++)
{
    texcoords[i] = new UV
    {
        U = reader.ReadSingle(),  // 4 bytes
        V = reader.ReadSingle()   // 4 bytes
    };
}

tb = new TexCoordBuffer(texcoords);

そしてUV:

[StructLayout(LayoutKind.Sequential)]
struct UV
{
    public float U { get; set; }
    public float V { get; set; }
}

属性の作成:

GL.EnableVertexAttribArray(2);
texCoordBuffer.Bind();
GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);
GL.BindAttribLocation(shaderHandle, 2, "in_texture");

テクスチャが「作成」される方法:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapNearest);

GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int)TextureEnvMode.Replace);

GL.TexImage2D(
    TextureTarget.Texture2D,
    0,
    PixelInternalFormat.Rgba,
    bmpData.Width,
    bmpData.Height,
    0,
    PixelFormat.Bgra,
    PixelType.UnsignedByte,
    bmpData.Scan0);

GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);

結果は次のようになります。例は左、私のバージョンは右: 比較

4

1 に答える 1

2

はい、OpenGL のモデルをインポートするときは、V テクスチャ座標を反転する必要があります。3DS モデルと OpenGL の UV マップは異なります。OpenGL テクスチャ座標は(U; 1-V)

これは、インポート モデル コードで修正するか、3D モデリング ソフトウェアで UV を反転するための対応するオプションを選択することで修正できます。

この関連する質問の回答とコメントを見て、この動作を理解することができます: https://stackoverflow.com/a/8621571/405681

于 2013-01-04T15:07:27.207 に答える