Mapping texture on 3DS VAO turns out mirrored

2019-10-17 13:10发布

我实现了以下这个3DS modelloader 教程 。 目前我的程序使用VAOs做显示的东西。 这个工作至今简单的立方体和瓷砖。 纹理被正确显示。

然而,当我的3DS模型加载到VAO其不同的sotry。 这个模型看起来是正确的关于顶点,但质地沿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);

这是怎么证明:例离开,我的版本的权利:

Answer 1:

是的,你应该翻转的OpenGL导入模型当V纹理坐标。 在3DS模型和OpenGL UV贴图是不同的。 OpenGL的纹理坐标应该是(U; 1-V)

这可以在导入模型代码或通过选择相应的选项为您的3D建模软件翻转UV固定。

你可以看看答案和意见,了解这种行为在此相关的问题: https://stackoverflow.com/a/8621571/405681



文章来源: Mapping texture on 3DS VAO turns out mirrored