默认我加载这样的所有内容
for(int g = 0; g < faces.size(); g++)
{
glMaterialfv(GL_FRONT, GL_SPECULAR, materials[g].Ks);
glMaterialfv(GL_FRONT, GL_DIFFUSE, materials[g].Kd);
glMaterialfv(GL_FRONT, GL_AMBIENT, materials[g].Ka);
glMaterialf(GL_FRONT, GL_SHININESS, materials[g].Ns);
Texture t;
getTexture(&t, materials[g].pict);
glBindTexture(GL_TEXTURE_2D, t.texID);
glBegin(GL_TRIANGLES);
for(int f = 0; f < faces[g].size(); f++)
{
glNormal3f(normals[faces[g][f].vn1 - 1].x, normals[faces[g][f].vn1 - 1].y, normals[faces[g][f].vn1 - 1].z);
glTexCoord2f(texCoords[faces[g][f].vt1 - 1].u, texCoords[faces[g][f].vt1 - 1].v);
glVertex3f(vertices[faces[g][f].v1 - 1].x, vertices[faces[g][f].v1 - 1].y, vertices[faces[g][f].v1 - 1].z);
glNormal3f(normals[faces[g][f].vn2 - 1].x, normals[faces[g][f].vn2 - 1].y, normals[faces[g][f].vn2 - 1].z);
glTexCoord2f(texCoords[faces[g][f].vt2 - 1].u, texCoords[faces[g][f].vt2 - 1].v);
glVertex3f(vertices[faces[g][f].v2 - 1].x, vertices[faces[g][f].v2 - 1].y, vertices[faces[g][f].v2 - 1].z);
glNormal3f(normals[faces[g][f].vn3 - 1].x, normals[faces[g][f].vn3 - 1].y, normals[faces[g][f].vn3 - 1].z);
glTexCoord2f(texCoords[faces[g][f].vt3 - 1].u, texCoords[faces[g][f].vt3 - 1].v);
glVertex3f(vertices[faces[g][f].v3 - 1].x, vertices[faces[g][f].v3 - 1].y, vertices[faces[g][f].v3 - 1].z);
}
glEnd();
}
非常慢,所以我决定使用assimp。 模型本身加载得很好。但它们根本没有任何纹理(好像有颜色存在)
我加载这样的材料
for (unsigned int i = 0 ; i < pScene->mNumMaterials ; i++) {
const aiMaterial* pMaterial = pScene->mMaterials[i];
m_Textures[i] = NULL;
//GL_SHININESS GL_SPECULAR GL_DIFFUSE GL_AMBIENT
if (pMaterial->GetTextureCount(aiTextureType_DIFFUSE) > 0) {
aiString Path;
if (pMaterial->GetTexture(aiTextureType_DIFFUSE, 0, &Path, NULL, NULL, NULL, NULL, NULL) == AI_SUCCESS) {
std::string FullPath = Dir + "/" + Path.data;
m_Textures[i] = new Texture();
if (!LoadTGA(m_Textures[i], const_cast<char*>(FullPath.c_str())))
{
printf("Error loading texture '%s'\n", FullPath.c_str());
delete m_Textures[i];
m_Textures[i] = NULL;
Ret = false;
}
else {
printf("Loaded texture '%s'\n", FullPath.c_str());
glGenTextures(1, &m_Textures[i]->texID);
glBindTexture(GL_TEXTURE_2D, m_Textures[i]->texID);
glTexImage2D(GL_TEXTURE_2D,
0,
m_Textures[i]->bpp / 8,
m_Textures[i]->width,
m_Textures[i]->height,
0,
m_Textures[i]->type,
GL_UNSIGNED_BYTE,
m_Textures[i]->imageData);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
}
}
}
我将aiTextureType
设置为漫反射,但在我的.obj文件中还有shininess, specular, ambient
个素材。
我画这样的一切
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
for (unsigned int i = 0 ; i < m_Entries.size() ; i++) {
glBindBuffer(GL_ARRAY_BUFFER, m_Entries[i].VB);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(TVertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), (const GLvoid*)20);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_Entries[i].IB);
const unsigned int MaterialIndex = m_Entries[i].MaterialIndex;
if (MaterialIndex < m_Textures.size() && m_Textures[MaterialIndex]) {
glClientActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_Textures[MaterialIndex]->texID);
}
glDrawElements(GL_TRIANGLES, m_Entries[i].NumIndices, GL_UNSIGNED_INT, 0);
}
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
那么如何加载其他类型的材料?
答案 0 :(得分:0)
由于此处没有答案,
http://assimp.sourceforge.net/lib_html/material_8h.html#a7dd415ff703a2cc53d1c22ddbbd7dde0
枚举:
<强> aiTextureType_NONE 强>
虚拟价值。没有纹理,但用作&#39;纹理语义的值#39; (#aiMaterialProperty :: mSemantic)用于与纹理无关的所有材质属性。
<强> aiTextureType_DIFFUSE 强>
纹理与漫反射光照方程的结果相结合。<强> aiTextureType_SPECULAR 强>
纹理与镜面反射方程的结果相结合。<强> aiTextureType_AMBIENT 强>
纹理与环境光照方程的结果相结合。<强> aiTextureType_EMISSIVE 强>
纹理将添加到光照计算的结果中。它不受入射光的影响。
<强> aiTextureType_HEIGHT 强> 纹理是高度图。
按照惯例,较高的灰度值代表从基准高度开始的较高海拔。
<强> aiTextureType_NORMALS 强>
纹理是(切线空间)法线贴图。同样,切线空间法线贴图有几种约定。 Assimp(故意)在这里没有区分。
<强> aiTextureType_SHININESS 强>
纹理定义了材质的光泽度。光泽度实际上是镜面(phong)照明方程的指数。通常存在定义的转换函数以将纹理中的线性颜色值映射到合适的指数。玩得开心。
<强> aiTextureType_OPACITY 强>
纹理定义了每像素不透明度。通常&#39;白色&#39;意味着不透明和黑色&#39;意味着透明度&#39;或者恰恰相反。玩得开心。
<强> aiTextureType_DISPLACEMENT 强>
位移纹理。确切的目的和格式取决于应用程序。 较高的颜色值代表较高的顶点位移。
<强> aiTextureType_LIGHTMAP 强>
光照贴图纹理(又名环境光遮挡)两个&#39;光照贴图&#39;和专用的环境遮挡地图&#39;受此物质财产保护。纹理包含像素的最终颜色值的缩放值。它的强度不受入射光的影响。
<强> aiTextureType_REFLECTION 强>
反射纹理。包含完美镜面反射的颜色。很少使用,几乎从不用于实时应用。
<强> aiTextureType_UNKNOWN 强>
纹理不明。与上述任何定义都不匹配的纹理参考被认为是“未知”。它仍然是导入的,但不包含在任何进一步的后处理中。