Opengl 3DS VAO上的贴图纹理显示为镜像纹理
我实现了一个3ds modelloader。 目前我的程序使用VAOs来显示东西。到目前为止,这对简单的立方体和瓷砖都有效。纹理显示正确 但是,当我将3DS模型加载到VAO中时,它是一个不同的sotry。关于顶点,模型看起来是正确的,但由于某些原因,纹理沿Y轴镜像 这是我如何读取UV的: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
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);