テクスチャリングに少し問題があります。
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;
}
それで、それはそれについてです。私が言ったように、エラーは発生しません。すべてが正常に読み込まれ、表示されますが、テクスチャの代わりに黒さしか得られません。