OpenGL 纹理未在模型上正确渲染
OpenGL texture not rendered properly on model
在我的 opengl 应用程序中,模型上的纹理渲染不正确。
这是结果的屏幕截图:
兔子应该是这样的:
expected result
这是加载纹理的代码。
stbi_set_flip_vertically_on_load(1);
m_LocalBuffer = stbi_load(path.c_str(), &m_Width, &m_Height, &m_BPP, 0);
GLCall(glGenTextures(1, &m_RendererID));
GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
GLCall(glGenerateMipmap(GL_TEXTURE_2D));
GLenum format = GL_RGBA;
//..switching on m_BPP to set format, omitted here
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_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));
GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0, format, GL_UNSIGNED_BYTE, m_LocalBuffer));
GLCall(glBindTexture(GL_TEXTURE_2D, 0));
if (m_LocalBuffer) {
stbi_image_free(m_LocalBuffer);
}
这是我正在使用的纹理文件
Texture File
我从 https://blenderartists.org/t/uv-unwrapped-stanford-bunny-happy-spring-equinox/1101297 下载了资产(3.3Mb link)
这是我在 texCoords 中读取的代码
for (size_t i = 0; i < mesh->mNumVertices; i++) {
//..read in positions and normals
if (mesh->mTextureCoords[0]) {
vertex.TexCoords.x = mesh->mTextureCoords[0][i].x;
vertex.TexCoords.y = mesh->mTextureCoords[0][i].y;
}
}
我正在使用 assimp 将模型加载为 obj 文件。我只是从结果中读取纹理坐标并将其传递给着色器。 (GLCall 只是我在渲染器中的一个调试宏)
这可能是什么原因造成的?让我知道是否需要更多信息。非常感谢!
图像似乎垂直翻转(围绕 x-axis)。为了弥补这一点,您必须在加载图像后手动翻转图像。或者,如果您翻转了图像,则必须忽略它。图片是否需要翻转,取决于图片格式。
在我的 opengl 应用程序中,模型上的纹理渲染不正确。
这是结果的屏幕截图:
兔子应该是这样的: expected result
这是加载纹理的代码。
stbi_set_flip_vertically_on_load(1);
m_LocalBuffer = stbi_load(path.c_str(), &m_Width, &m_Height, &m_BPP, 0);
GLCall(glGenTextures(1, &m_RendererID));
GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
GLCall(glGenerateMipmap(GL_TEXTURE_2D));
GLenum format = GL_RGBA;
//..switching on m_BPP to set format, omitted here
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_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));
GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0, format, GL_UNSIGNED_BYTE, m_LocalBuffer));
GLCall(glBindTexture(GL_TEXTURE_2D, 0));
if (m_LocalBuffer) {
stbi_image_free(m_LocalBuffer);
}
这是我正在使用的纹理文件 Texture File
我从 https://blenderartists.org/t/uv-unwrapped-stanford-bunny-happy-spring-equinox/1101297 下载了资产(3.3Mb link)
这是我在 texCoords 中读取的代码
for (size_t i = 0; i < mesh->mNumVertices; i++) {
//..read in positions and normals
if (mesh->mTextureCoords[0]) {
vertex.TexCoords.x = mesh->mTextureCoords[0][i].x;
vertex.TexCoords.y = mesh->mTextureCoords[0][i].y;
}
}
我正在使用 assimp 将模型加载为 obj 文件。我只是从结果中读取纹理坐标并将其传递给着色器。 (GLCall 只是我在渲染器中的一个调试宏)
这可能是什么原因造成的?让我知道是否需要更多信息。非常感谢!
图像似乎垂直翻转(围绕 x-axis)。为了弥补这一点,您必须在加载图像后手动翻转图像。或者,如果您翻转了图像,则必须忽略它。图片是否需要翻转,取决于图片格式。