使用 Assimp 在运行时更改 .OBJ 的内存纹理
Change .OBJ's memory texture in runtime using Assimp
在我的程序 (C++/OpenGL/Assimp/Windows10) 中,我加载并显示了一个 .OBJ 文件及其对应的 .MTL
一切正常,但我需要:
- 从内存加载而不是 .MTL 文件中写入的任何内容(例如:map_Kd output.jpg)。
- 我需要在运行时更改纹理。
这是我的 LoadOpenGLTexture(),我正在使用 DevIL 加载纹理(将更改为 OpenCV)。
bool Model::LoadGLTextures(const aiScene* scene)
{
ILboolean success;
ilInit();
for (unsigned int m = 0; m < scene->mNumMaterials; ++m)
{
int texIndex = 0;
aiString path; // filename
aiReturn texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex,
&path);
while (texFound == AI_SUCCESS)
{
//fill map with textures, OpenGL image ids set to 0
textureIdMap[path.data] = 0;
// more textures?
texIndex++;
texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex, &path);
}
}
int numTextures = textureIdMap.size();
/* create and fill array with DevIL texture ids */
ILuint* imageIds = new ILuint[numTextures];
ilGenImages(numTextures, imageIds);
/* create and fill array with GL texture ids */
GLuint* textureIds = new GLuint[numTextures];
glGenTextures(numTextures, textureIds); /* Texture name generation */
/* get iterator */
std::map<std::string, GLuint>::iterator itr = textureIdMap.begin();
int i = 0;
for (; itr != textureIdMap.end(); ++i, ++itr)
{
//save IL image ID
std::string filename = (*itr).first; // get filename
(*itr).second = textureIds[i]; // save texture id for filename in map
ilBindImage(imageIds[i]); /* Binding of DevIL image name */
ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
success = ilLoadImage((ILstring)filename.c_str());
if (success) {
/* Convert image to RGBA */
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
/* Create and load textures to OpenGL */
glBindTexture(GL_TEXTURE_2D, textureIds[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ilGetInteger(IL_IMAGE_WIDTH),
ilGetInteger(IL_IMAGE_HEIGHT), 0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());
}
else
printf("Couldn't load Image: %s\n", filename.c_str());
}
/* Because we have already copied image data into texture data
we can release memory used by image. */
ilDeleteImages(numTextures, imageIds);
//Cleanup
delete[] imageIds;
delete[] textureIds;
//return success;
return true;
}
目前 Asset-Importer-Lib 中的纹理定义不提供纹理-/material-定义的动态更新。纹理的每个定义在应用程序运行期间都保持稳定,您无法更改它。
如果您对这样的功能感兴趣,我们需要以适当的方式更新 material-系统,以便用户可以使用它。因此,如果您对此功能感兴趣,最好能更好地了解您的要求/用例。
您可以在我们的项目端为其打开功能请求,请参阅:Assimp on Github
在我的程序 (C++/OpenGL/Assimp/Windows10) 中,我加载并显示了一个 .OBJ 文件及其对应的 .MTL
一切正常,但我需要:
- 从内存加载而不是 .MTL 文件中写入的任何内容(例如:map_Kd output.jpg)。
- 我需要在运行时更改纹理。
这是我的 LoadOpenGLTexture(),我正在使用 DevIL 加载纹理(将更改为 OpenCV)。
bool Model::LoadGLTextures(const aiScene* scene)
{
ILboolean success;
ilInit();
for (unsigned int m = 0; m < scene->mNumMaterials; ++m)
{
int texIndex = 0;
aiString path; // filename
aiReturn texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex,
&path);
while (texFound == AI_SUCCESS)
{
//fill map with textures, OpenGL image ids set to 0
textureIdMap[path.data] = 0;
// more textures?
texIndex++;
texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex, &path);
}
}
int numTextures = textureIdMap.size();
/* create and fill array with DevIL texture ids */
ILuint* imageIds = new ILuint[numTextures];
ilGenImages(numTextures, imageIds);
/* create and fill array with GL texture ids */
GLuint* textureIds = new GLuint[numTextures];
glGenTextures(numTextures, textureIds); /* Texture name generation */
/* get iterator */
std::map<std::string, GLuint>::iterator itr = textureIdMap.begin();
int i = 0;
for (; itr != textureIdMap.end(); ++i, ++itr)
{
//save IL image ID
std::string filename = (*itr).first; // get filename
(*itr).second = textureIds[i]; // save texture id for filename in map
ilBindImage(imageIds[i]); /* Binding of DevIL image name */
ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
success = ilLoadImage((ILstring)filename.c_str());
if (success) {
/* Convert image to RGBA */
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
/* Create and load textures to OpenGL */
glBindTexture(GL_TEXTURE_2D, textureIds[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ilGetInteger(IL_IMAGE_WIDTH),
ilGetInteger(IL_IMAGE_HEIGHT), 0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());
}
else
printf("Couldn't load Image: %s\n", filename.c_str());
}
/* Because we have already copied image data into texture data
we can release memory used by image. */
ilDeleteImages(numTextures, imageIds);
//Cleanup
delete[] imageIds;
delete[] textureIds;
//return success;
return true;
}
目前 Asset-Importer-Lib 中的纹理定义不提供纹理-/material-定义的动态更新。纹理的每个定义在应用程序运行期间都保持稳定,您无法更改它。 如果您对这样的功能感兴趣,我们需要以适当的方式更新 material-系统,以便用户可以使用它。因此,如果您对此功能感兴趣,最好能更好地了解您的要求/用例。
您可以在我们的项目端为其打开功能请求,请参阅:Assimp on Github