Opengl 3DS VAO上的贴图纹理显示为镜像纹理

Opengl 3DS VAO上的贴图纹理显示为镜像纹理,opengl,textures,shader,3ds,Opengl,Textures,Shader,3ds,我实现了一个3ds modelloader。 目前我的程序使用VAOs来显示东西。到目前为止,这对简单的立方体和瓷砖都有效。纹理显示正确 但是,当我将3DS模型加载到VAO中时,它是一个不同的sotry。关于顶点,模型看起来是正确的,但由于某些原因,纹理沿Y轴镜像 这是我如何读取UV的: case 0x4140: qty = reader.ReadUInt16(); // 2 bytes UV[] texcoords = new UV[qty]; for (i = 0; i

我实现了一个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);
创建属性:

GL.EnableVertexAttribArray(2);
texCoordBuffer.Bind();
GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);
GL.BindAttribLocation(shaderHandle, 2, "in_texture");
如何“创建”纹理:

结果如下:示例左,我的版本右:

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

这可以在“导入模型代码”中修复,也可以通过在三维建模软件中选择翻转UV的相应选项来修复


您可以查看答案和注释,了解这个相关问题中的这种行为:

可能只是不兼容。您的代码看起来很好,所以可能只是导出选项有问题。尝试更多来自不同来源的模型并验证。谢谢,这是soloution。现在看起来好多了。
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);