在3DS VAO上映射纹理结果是镜像的

时间:2013-01-04 11:39:28

标签: opengl textures shader 3ds

我在此tutorial之后实施了一个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);

紫外线:

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

结果如下:示例左,我的版本正确: Comparision

1 个答案:

答案 0 :(得分:2)

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

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

您可以查看答案和评论,以便在相关问题中了解此行为:https://stackoverflow.com/a/8621571/405681