Ich lade Texturen mit Verweis in. Mtl-Datei kommt mit. Obj meines Modells. Ich verwende Assimp-Bibliothek für diesen Zweck.OpenGL (Kernprofil) Texturen fehlen oder schwarz
Das Problem ist, wie im Titel angegeben, Textur erscheint nicht auf dem Modell oder (was ich nicht glauben kann) es ist schwarz.
Hier ist der Code für das Laden der Textur ist:
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;
}
Okay, lesen Sie diese beiden Funktionen .mtl für Texturnamen und sie aus dem gleichen Verzeichnis laden. Ich bin mit dem Debugger durch den Code gegangen, und Breite und Höhe sind korrekt eingestellt und der Bildzeiger zeigt auf das Zeichenfeld. Das lässt mich denken, dass dieser Teil gut ist.
Weitere zurück Textur Struktur geht in einen Konstruktor meines Netzobjekt:
mesh::mesh(std::vector<vertex> vertices, std::vector<GLuint> indices, std::vector<texture> textures)
: vertices(vertices), textures(textures), indices(indices)
{
this->setupMesh();
}
In setupMesh I grundlegenden Attribute Setup durchführen, Bindungen an die Puffer etc .. Während der Rendering-Schleife I Mesh- nennen> zeichnen() -Methode, die wie folgt aussieht:
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);
}
}
das wichtige Bit (imho) hier ist der Aufruf zu einheitlichen Update:
glUniform1i(glGetUniformLocation(shader->shaderProgID, (name + number).c_str()), i);
Und wieder hier kein Problem, ich hatte misstype, Shader would't kompiliert, hier ist der Shader:
#version 330 core
in vec2 TexCoords;
in vec4 customColor;
uniform sampler2D tex_diff1;
void main()
{
gl_FragColor = vec4(texture(tex_diff1, TexCoords));
}
Name "tex_diff1" ist der genaue Elementname, der während des Ziehens verwendet wird() Anruf. Zusätzlich habe ich getestet, ob die Texturkoordinaten gut sind, ich gebe die Farbe im Fragment Shader basierend auf den Werten von texCoords aus. Als Ergebnis bekam ich ein farbenfrohes Modell, was bedeutete, dass alles gut war.
Die Frage ist also, was fehlt?
Irgendwelche Ideen wo zu graben und was zu schütteln?
PS.
Sind Sie sich bewusst Sie Ihre Vektoren kopieren, wenn sie als Argumente in Mesh gegeben :: mesh()? –