私のモデルの.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を使用するシェーダーを語っている。では
あなたは、メッシュ内の引数として渡されたときに、あなたのベクトルをコピーしている知っています::メッシュ()? –