【问题标题】:Mapping texture on 3DS VAO turns out mirrored3DS VAO 上的贴图纹理变成镜像
【发布时间】:2012-12-18 20:27:15
【问题描述】:

我在tutorial 之后实现了一个 3ds 模型加载器。 目前我的程序使用 VAO 来显示东西。到目前为止,这适用于简单的立方体和瓷砖。纹理显示正确。

但是,当我将 3DS 模型加载到 VAO 中时,它会出现不同的情况。模型在顶点方面看起来是正确的,但由于某种原因纹理沿 Y 轴镜像。

这就是我阅读紫外线的方式:

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);

还有紫外线:

[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);

结果是这样的:左边的例子,右边的我的版本:

【问题讨论】:

  • 可能只是不兼容。您的代码似乎完全没问题,所以也许这只是导出选项的问题。尝试来自不同来源的更多模型并进行验证。

标签: opengl textures shader 3ds


【解决方案1】:

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

这可以在导入模型代码中解决,也可以通过在 3D 建模软件中选择用于翻转 UV 的相应选项来解决。

您可以查看 answer 和 cmets 以了解此相关问题中的这种行为:https://stackoverflow.com/a/8621571/405681

【讨论】:

  • 谢谢,这是解决方案。现在看起来好多了。
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 2013-10-10
  • 2019-03-16
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多