2

默认情况下,我会像这样加载所有内容

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);

那么如何加载其他类型的材料呢?

4

1 回答 1

0

由于这里没有答案,

http://assimp.sourceforge.net/lib_html/material_8h.html#a7dd415ff703a2cc53d1c22ddbbd7dde0

枚举器:

aiTextureType_NONE
虚拟值。

没有纹理,但该值用作与纹理无关的所有材料属性的“纹理语义”(#aiMaterialProperty::mSemantic)。

aiTextureType_DIFFUSE
纹理与漫反射光照方程的结果相结合。

aiTextureType_SPECULAR
纹理与镜面光照方程的结果相结合。

aiTextureType_AMBIENT
纹理与环境光照方程的结果相结合。

aiTextureType_EMISSIVE
纹理被添加到光照计算的结果中。

它不受入射光的影响。

aiTextureType_HEIGHT 纹理是一个高度图。

按照惯例,较高的灰度值代表从基本高度开始的较高海拔。

aiTextureType_NORMALS
纹理是(切线空间)法线贴图。

同样,切线空间法线贴图有几个约定。Assimp 确实(故意)不在这里区分。

aiTextureType_SHININESS
纹理定义材质的光泽度。

光泽度实际上是镜面反射(phong)光照方程的指数。通常会定义一个转换函数来将纹理中的线性颜色值映射到合适的指数。玩得开心。

aiTextureType_OPACITY
纹理定义每个像素的不透明度。

通常“白色”表示不透明,“黑色”表示“透明”。或者恰恰相反。玩得开心。

aiTextureType_DISPLACEMENT
置换纹理。

确切的目的和格式取决于应用程序。较高的颜色值代表较高的顶点位移。

aiTextureType_LIGHTMAP
光照贴图纹理(又名环境光遮蔽)

此材质属性涵盖“光照贴图”和专用的“环境遮挡贴图”。纹理包含像素最终颜色值的缩放值。它的强度不受入射光的影响。

aiTextureType_REFLECTION
反射纹理。

包含完美镜面反射的颜色。很少使用,几乎从不用于实时应用程序。

aiTextureType_UNKNOWN
未知纹理。

与上述任何定义都不匹配的纹理参考被视为“未知”。它仍然被导入,但被排除在任何进一步的后处理之外。

于 2018-03-24T12:56:18.573 回答