C# OpenGL 3D纹理mip贴图

C# OpenGL 3D纹理mip贴图,c#,opengl,opentk,C#,Opengl,Opentk,我试图实现3D纹理作为纹理图集的替代品。我想把它用于地形表面。在我尝试使用mip贴图之前,3D纹理效果很好(输出颜色始终为黑色) 生成: int glTexture; glTarget = TextureTarget.Texture3D; GL.GenTextures(1, out glTexture); GL.BindTexture(glTarget, glTexture); for (int level = 0; level < LevelCount; level++){

我试图实现3D纹理作为纹理图集的替代品。我想把它用于地形表面。在我尝试使用mip贴图之前,3D纹理效果很好(输出颜色始终为黑色)

生成:

int glTexture;
glTarget = TextureTarget.Texture3D;

GL.GenTextures(1, out glTexture);
GL.BindTexture(glTarget, glTexture);

for (int level = 0; level < LevelCount; level++){
    GL.TexImage3D(glTarget, level, glInternalFormat, width, height, depth, 0, glFormat, glType, IntPtr.Zero);

    width = width >> 1;
    height = height >> 1;
}

我确信,所有mip映射都已设置(Apitrace显示512到1之间的所有映射)。知道发生了什么吗?

3D纹理是纹理地图集的一个很差的替代品。它们应该被视为体积纹理,尤其是当涉及到它们的mipchain时,因为以任何其他方式来考虑它们都是非常不直观的

这些数字来自微软,但也适用于德国劳埃德船级社

二维阵列纹理Mipchain(立方体贴图):

3D纹理链:


用于将数据上载到二维阵列纹理中的层的API与三维纹理相同,但数据的表示方式却截然不同(尤其是在mipmap方面)。三维纹理很难替代纹理地图集。它们应该被视为体积纹理,尤其是当涉及到它们的mipchain时,因为以任何其他方式来考虑它们都是非常不直观的

这些数字来自微软,但也适用于德国劳埃德船级社

二维阵列纹理Mipchain(立方体贴图):

3D纹理链:


用于将数据上载到二维阵列纹理中的层的API与三维纹理相同,但数据的表示方式截然不同(尤其是在mipmap方面)。要为三维纹理指定正确的mipmap,需要在所有3个方向上减小每个级别的大小:

for (int level = 0; level < LevelCount; level++){
    GL.TexImage3D(glTarget, level, glInternalFormat, width, height, depth, 0,
                  glFormat, glType, IntPtr.Zero);

    width = width >> 1;
    height = height >> 1;
    depth = depth >> 1;
}

与3D纹理和2D纹理阵列之间的MIPMAP大小不同有关,它们的采样方式也存在差异。对于三维纹理,在所有3个方向上都有mipmapping。因此,线性采样可以从两个不同的mipmap级别分别使用8个texel。对于2D纹理阵列,采样将始终仅使用单个层中的texel,这意味着将使用来自2个mipmap级别的4个texel。若要为3D纹理指定正确的mipmap,您需要在所有3个方向上减小每个级别的大小:

for (int level = 0; level < LevelCount; level++){
    GL.TexImage3D(glTarget, level, glInternalFormat, width, height, depth, 0,
                  glFormat, glType, IntPtr.Zero);

    width = width >> 1;
    height = height >> 1;
    depth = depth >> 1;
}

与3D纹理和2D纹理阵列之间的MIPMAP大小不同有关,它们的采样方式也存在差异。对于三维纹理,在所有3个方向上都有mipmapping。因此,线性采样可以从两个不同的mipmap级别分别使用8个texel。对于2D纹理阵列,采样将始终仅使用单个层中的纹理,这意味着使用两个mipmap级别中的每个纹理4个纹理。

如果要替换纹理图集,我建议使用纹理阵列,因为3D纹理使用mipmap的方式对分离2D纹理没有帮助。这可能是你的问题。这里的更多信息:如果你想替换纹理图集,我建议使用纹理数组,因为3D纹理使用mipmapping的方式对分离2d纹理没有帮助。这可能是你的问题。更多信息请点击此处:
glTarget = TextureTarget.Texture2DArray;