无法手动设置每个纹理 mipmap 级别
Not able to set each texture mipmap level manually
我无法在opengl中手动设置mipmap级别。这不会引发错误,但不显示纹理。取消注释 glGenerateMipmap(GL_TEXTURE_2D( 有效(意味着它可以工作,mipmap 级别不是由我设置的(。
我的 mipmap 级别似乎是完整的,因为最后一个级别 (12( 是 1x1 图像。 知道我在这里可能做错了什么吗?
Texture::Texture(const std::string texture_levels[])
: m_FilePath(texture_levels[0]), m_LocalBuffer(nullptr), m_Width(0), m_Height(0), m_BPP(0)
{
stbi_set_flip_vertically_on_load(1);
GLCall(glGenTextures(1, &m_RendererID));
GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0));
GLCall(glTexParameteri(GL_TEXTURE_2D, G_TEXTURE_MAX_LEVEL, 12));
for (int i = 0; i < 13; i++) {
m_LocalBuffer = stbi_load(texture_levels[i].c_str(), &m_Width, &m_Height, &m_BPP, 4);
GLCall(glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer));
}
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
// glGenerateMipmap(GL_TEXTURE_2D);
GLCall(glBindTexture(GL_TEXTURE_2D, 0));
if (m_LocalBuffer)
stbi_image_free(m_LocalBuffer);
}
Texture::~Texture()
{
GLCall(glDeleteTextures(1, &m_RendererID));
}
void Texture::Bind(unsigned int slot) const
{
GLCall(glActiveTexture(GL_TEXTURE0 + slot));
GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
}
void Texture::Unbind()
{
GLCall(glBindTexture(GL_TEXTURE_2D, 0));
}
在主.cpp:
std::string texture_levels[] =
{
"res/textures/istanbul/01.png",
"res/textures/istanbul/02.png",
"res/textures/istanbul/03.png",
"res/textures/istanbul/04.png",
"res/textures/istanbul/05.png",
"res/textures/istanbul/06.png",
"res/textures/istanbul/07.png",
"res/textures/istanbul/08.png",
"res/textures/istanbul/09.png",
"res/textures/istanbul/10.png",
"res/textures/istanbul/11.png",
"res/textures/istanbul/12.png",
"res/textures/istanbul/13.png"
};
Texture texture(texture_levels);
texture.Bind();
一个级别的 mitmap 大小必须是前一个级别的一半,向下舍入。 请参阅 Mipmap 完整性。
更具体地说,mipmap在级别i
的宽度,高度或深度的大小是纹理图像的相应大小除以2^i
的组成部分。对于所有维度,最后一个 mipmap 级别的大小为 1,因此 mipmap 级别的数量取决于纹理的大小,并且log2(maxsize) + 1
(截断(,其中maxsize
是具有最大大小的纹理的二元。
规范中的相关部分是 OpenGL 4.6 API 核心配置文件规范 - 8.14.3 Mipmapping,第 265 页
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- UE4.动态纹理创建和 mipmap
- 无法手动设置每个纹理 mipmap 级别
- OpenGL 3.+中带有mipmap的数组纹理