2016-07-14 10 views
0

私のモデルの.objに付属の.mtlファイルの参照を使用してテクスチャをロードしています。 私はこの目的のためにAssimpライブラリを使用しています。OpenGL(コアプロファイル)のテクスチャが欠けているか黒です。

タイトルに記載されているように、モデルにテクスチャが表示されない、または(私が信じることができない)黒です。ここで

はテクスチャをロードするためのコードです:

std::vector<texture> model::loadMaterialTextures(aiMaterial * mat, aiTextureType type, std::string typeName) 
{ 
    std::vector<texture> textures; 

    for (GLuint i = 0; i < mat->GetTextureCount(type); i++) 
    { 
     aiString str; 
     mat->GetTexture(type, i, &str); 

     GLboolean skip = false; 

     for (GLuint j = 0; j < textures_loaded.size(); j++) 
     { 
      if (textures_loaded[j].path == str) 
      { 
       skip = true; 
       break; 
      } 
     } 

     if (!skip) 
     { 
      texture tex; 
      tex.id = textureFromFile(str.C_Str(), this->directory); 
      tex.type = typeName; 
      tex.path = str; 
      textures.push_back(tex); 
      this->textures_loaded.push_back(tex); 
     } 
    } 

    return textures; 
} 

GLint model::textureFromFile(const char* path, std::string directory) 
{ 
    //Generate texture ID and load texture data 
    std::string filename = std::string(path); 
    filename = directory + '\\' + filename; 

    GLuint textureID; 
    glGenTextures(1, &textureID); 
    glBindTexture(GL_TEXTURE_2D, textureID); 

    int width, height; 
    unsigned char* image = SOIL_load_image(filename.c_str(), &width, &height, 0, SOIL_LOAD_RGB); 

    std::cout << SOIL_last_result() << std::endl; 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    //auto e = glGetError(); 

    // Parameters 
    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_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glBindTexture(GL_TEXTURE_2D, 0); 
    SOIL_free_image_data(image); 

    return textureID; 
} 

さて、この2つの関数は、テクスチャ名に.mtlを読み、同じディレクトリからロードします。私はデバッガでコードをステップ実行し、幅と高さが正しく設定され、イメージポインタが文字配列を指しています。これは私がこの部分が良いと思うようにする。

さらに返されたテクスチャ構造体は、私のメッシュオブジェクトのコンストラクタに行く:

setupMeshで
mesh::mesh(std::vector<vertex> vertices, std::vector<GLuint> indices, std::vector<texture> textures) 
    : vertices(vertices), textures(textures), indices(indices) 
{ 
    this->setupMesh(); 
} 

私はmesh-呼び出すレンダリングループの間に基本的な属性の設定、バッファなどへのバインディング.. を実行>描きますこのようになります()メソッド:

void mesh::draw(shader* shader) 
{ 
    GLuint tex_diffNumber = 1; 
    GLuint tex_specNumber = 1; 

    for (GLuint i = 0; i < this->textures.size() ; i++) 
    { 
     //load target texture 
     glActiveTexture(GL_TEXTURE0 + 1); 

     std::stringstream sstream; 
     std::string number; 
     std::string name = this->textures[i].type; 

     if (name == TEX_DIFF_NAME) 
      sstream << tex_diffNumber++; 
     else if (name == TEX_SPEC_NAME) 
      sstream << tex_specNumber++; 

     number = sstream.str(); 

     glBindTexture(GL_TEXTURE_2D, this->textures[i].id); 
     glUniform1i(glGetUniformLocation(shader->shaderProgID, (name + number).c_str()), i); 

    } 

    //set shininess 
    //glUniform1f(glGetUniformLocation(shader->shaderProgID, "material.shininess"), 16.0f); 

    //draw 
    glBindVertexArray(this->vao); 
    glDrawElements(GL_TRIANGLES, this->indices.size(), GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 

    //release 
    for (GLuint i = 0; i < this->textures.size(); i++) 
    { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, 0); 
    } 
} 

重要なビット(私見)は、ここで均一なアップデートの呼び出しです0

そして再び、ここでは問題は、私はシェーダがコンパイルwould't、misstypeなかった、ここでのシェーダは次のとおりです。

#version 330 core 

in vec2 TexCoords; 
in vec4 customColor; 

uniform sampler2D tex_diff1; 

void main() 
{  
    gl_FragColor = vec4(texture(tex_diff1, TexCoords)); 
} 

名「tex_diff1は」(引き分けの際に使用される正確なメンバー名です)コール。 さらに、テクスチャの座標が良好かどうかをテストしました.texCoordsの値に基づいてフラグメントシェーダで色を出力しました。その結果、私はカラフルなモデルを手に入れました。それはすべてが良いことを意味しました。

質問には何がありますか?

どこから掘るべきか、何を揺さぶるのか?

PS。ループのために、あなたはGL_TEXTURE0 + 1に常にアクティブなテクスチャを設定しているが、あなたはテクスチャユニットiを使用するシェーダーを語っている。では

Problem image

Texcoords as color

+1

あなたは、メッシュ内の引数として渡されたときに、あなたのベクトルをコピーしている知っています::メッシュ()? –

答えて

2

おそらくあなたのような何かをしたかった:

for (GLuint i = 0; i < this->textures.size() ; i++) 
{ 
    glActiveTexture(GL_TEXTURE0 + i); 
    glBindTexture(GL_TEXTURE_2D, this->textures[i].id); 
    glUniform1i(glGetUniformLocation(shader->shaderProgID, (name + number).c_str()), i); 
} 
+0

Omg、これはこの嫌なタイプミスでした。私に気づいてくれてありがとう! –

関連する問題