0

テクスチャリングに少し問題があります。

assimp を介してメッシュを読み込みます。これは完全に正常に機能します。モデルは本来あるべき姿に見えますが、黒です。

そのため、最初にシェーダーをロードしてから、頂点、面、UV を含むメッシュのロードを開始します。最小限に抑えるために、テクスチャ関連のコードのみを示します。

    texID = glGetUniformLocation(shaderProgram, "myTextureSampler");
    loadScene(modelPath);

loadScene は、モデルパスを介して取得したモデルシーン全体をインポートするようになりました。

だから、それが問題だとは思わない最初の部分ですが、デバッグはすべて問題ないように見えましたが、何かを見逃した可能性があります。FreeImage ライブラリを使用してテクスチャを取得します。

bool loadGLTextures(const aiScene* scene)
{

    /* unload image first */
    if (pImage) 
    {
        FreeImage_Unload(pImage);
        pImage = 0;
    }

    if (scene->HasTextures()) 
    {
        std::cerr << "Support for meshes with embedded textures is not (yet)
            implemented" << std::endl;
        return false;
    }

    /* getTexture Filenames and Numb of Textures */
    for (unsigned int m=0; m < scene->mNumMaterials; m++)
    {
        int texIndex = 0;
        aiReturn texFound = AI_SUCCESS;

        aiString path;  // filename

        while (texFound == AI_SUCCESS)
        {
            texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE,
                texIndex, &path);
        textureIdMap[path.data] = NULL;
        //fill map with textures, pointers still NULL yet
        texIndex++;
        }
    }

    int numTextures = textureIdMap.size();

    /* create and fill array with GL texture ids */
    textureIds = new GLuint[numTextures];
    glGenTextures(numTextures, textureIds); /* Texture name generation */

    /* get iterator */
    std::map<std::string, GLuint*>::iterator itr = textureIdMap.begin();

    for (int i=0; i < numTextures; i++)
    {
        std::string filename = (*itr).first;  // get filename
        (*itr).second = &textureIds[i]; // save texture id for filename in map
        itr++; // next texture

        std::string fileloc = basepath + filename;  /* Loading of image */

        // Check the file signature and deduce its format.  
        FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(fileloc.c_str(), 0);  

        // If still unknown, try to guess the file format from the file extension.  
        if(fif == FIF_UNKNOWN)  
        {  
            fif = FreeImage_GetFIFFromFilename(fileloc.c_str());  
        }  

        // If still unkown, return failure.  
        if(fif == FIF_UNKNOWN)  
        {  
            return false;  
        }  

        // Check that the plugin has reading capabilities and load the file.  
        if(FreeImage_FIFSupportsReading(fif))  
        {  
            pImage = FreeImage_Load(fif, fileloc.c_str());  
        } 

        if (pImage != 0) /* If no error occured: */
        {
            glBindTexture(GL_TEXTURE_2D, textureIds[i]);

            unsigned int width = pImage ? FreeImage_GetWidth(pImage) : 0;
            unsigned int height = pImage ? FreeImage_GetHeight(pImage) : 0;
            const BYTE *bits = pImage ? FreeImage_GetBits(pImage) : 0;

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                GL_LINEAR_MIPMAP_LINEAR); 
            // Initialise texture with image data.  
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, 
                GL_UNSIGNED_BYTE, bits);
            }
            else
            {
                /* Error occured */
                std::cerr << "Couldn't load image: " + fileloc << std::endl;
            }
        }

    //return success;
    return true;
}

テクスチャを取得した後、メッシュを探しますが、関連する唯一の部分は UV 部分とバインディングであるため、マテリアルのロードに進みましょう - まだライトがないので、そのままにしておきます最低でも。

void initMaterial(const aiMaterial* mtl)
{

    int texIndex = 0;
    aiString texPath; //contains filename of texture

    if(AI_SUCCESS == mtl->GetTexture(aiTextureType_DIFFUSE, texIndex, &texPath))
    {
        //bind texture
        GLuint texId = *textureIdMap[texPath.data];
        glBindTexture(GL_TEXTURE_2D, texId);
        glActiveTexture(GL_TEXTURE0);
    }
}

したがって、次の部分は頂点と法線にも当てはまりますが、現時点ではそれらはあまり重要ではありません。頂点は機能しますが、テクスチャは機能しません...

glUseProgram(shaderProgram);

glUniform1i(texID, 0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDisableVertexAttribArray(1);

そして、シェーダーを完成させるために、テクスチャリングをテストするためだけに、今のところ基本的なままにします。

頂点シェーダー

layout(location = 1) in vec2 vertexUV;

// Output data ; will be interpolated for each fragment.
out vec2 UV;

void main(){

....

    // UV of the vertex. No special space for this one.
    UV = vertexUV;
}

フラグメントシェーダー

// Interpolated values from the vertex shaders
in vec2 UV;

// Ouput data
out vec3 color;

// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;

void main(){

    // Output color = color of the texture at the specified UV
    color = texture2D( myTextureSampler, UV ).rgb;
}

それで、それはそれについてです。私が言ったように、エラーは発生しません。すべてが正常に読み込まれ、表示されますが、テクスチャの代わりに黒さしか得られません。

4

1 に答える 1

4

minifiaction フィルターを指定しますGL_LINEAR_MIPMAP_LINEARが、レベル 0 のみを指定するため、テクスチャは完全なミップマップではありません (ここでは画像が 1x1 より大きいと想定しています)。いくつかのオプションがあります:

  1. のような別のフィルタを使用しますGL_LINEAR。これは、動作を開始するかどうかを確認するための簡単なテストとして特に役立ちます。
  2. ミップマップレベルのセット全体を提供します。各レベルは、1x1 に達するまで、前のレベルの幅の 1/2 と高さの 1/2 になります。
  3. を介して GL にミップマップ レベルを生成させますglGenerateMipmap()
于 2013-05-19T20:29:42.093 に答える