So habe ich einige Probleme mit der Anwendung einer Textur auf meine Mesh in OpenGL. Ich habe nach einer Lösung gesucht, aber in vielen Forschungsstunden keine Lösung gefunden.Kann Textur in OpenGL nicht anzeigen
Ich hoffe, ein anderes Paar Augen könnte in der Lage sein, den Fehler in meinem Code zu fangen.
Alles funktioniert gut, wenn ich eine Farbe in meinem Shader gesetzt, aber wenn ich versuche, ihm eine Textur zu passieren, entweder ich
- Eine völlig unsichtbar Mesh erhalten, wenn das geladene Bild Transparenz ODER
- hat Ein einheitlich gefärbtes Netz, das eine Mischung der tatsächlichen Farben in meinem Bild zu sein scheint (im Fall von Bildern ohne Transparenz).
Der folgende Code zeichnet ein einfaches Quadrat und (sollte) eine Textur darauf anwenden.
Bild Loader:
void Texture::loadTexture(const char* _filename)
{
char fn[255] = "assets/textures/";
strcat(fn, _filename);
std::cout << fn << std::endl;
FREE_IMAGE_FORMAT format = FreeImage_GetFileType(fn, 0);
FIBITMAP* bitmap = FreeImage_Load(format, fn);
FIBITMAP* bitmap32 = nullptr;
unsigned int bitsPerPixel = FreeImage_GetBPP(bitmap);
std::cout << "Image BPP: " << bitsPerPixel << std::endl;
int imageWidth = FreeImage_GetWidth(bitmap);
int imageHeight = FreeImage_GetHeight(bitmap);
std::cout << "Image size: " << imageWidth << " x " << imageHeight << std::endl;
if (bitsPerPixel != 32)
bitmap32 = FreeImage_ConvertTo32Bits(bitmap);
else
bitmap32 = bitmap;
BYTE* textureData = FreeImage_GetBits(bitmap32);
//for(int i = 0; i < imageWidth * imageHeight * 4; i += 4) {
// std::cout << (int)textureData[i] << ", " << (int)textureData[i+1] << ", " << (int)textureData[i+2] << ", " << (int)textureData[i+3] << std::endl;
//}
glBindTexture(GL_TEXTURE_2D, m_ID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageWidth, imageHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)textureData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
FreeImage_Unload(bitmap);
if (bitsPerPixel != 32)
FreeImage_Unload(bitmap32);
}
ich bestätigt haben, dass die Bilddatei lädt und dass die Daten durch Ausgeben der Bilddaten in einem lesbaren Format korrekt ist. Die Ergebnisse sind wie erwartet.
Meine Hauptschleife:
int main()
{
const std::vector<sun::Vertex> vertices = {
sun::Vertex(sun::Vector3f(-4.0f, 4.0f, 0.0f), sun::Vector2f(0.0f, 1.0f)),
sun::Vertex(sun::Vector3f(4.0f, 4.0f, 0.0f), sun::Vector2f(1.0f, 1.0f)),
sun::Vertex(sun::Vector3f(-4.0f, -4.0f, 0.0f), sun::Vector2f(0.0f, 0.0f)),
sun::Vertex(sun::Vector3f(4.0f, -4.0f, 0.0f), sun::Vector2f(1.0f, 0.0f))
};
const std::vector<unsigned int> indices = {0, 1, 2, 1, 3, 2};
sun::Window window("My Game", 1280, 800);
sun::Shader shader("basic.vs", "basic.fs");
sun::Mesh mesh;
sun::Transform transform;
sun::Texture texture;
transform.setProjection(70.0f, window.getWidth(), window.getHeight(), 1.0f, -1000.0f);
mesh.addVertices(vertices, indices);
texture.loadTexture("test2.png");
shader.addUniform("transform");
shader.bind();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Start the main loop
while (!window.closeWindow()) {
// Render
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.3f, 0.8f, 1.0f, 1.0f);
transform.setTranslation(0.0f, 0.0f, 10.0f);
shader.setUniform("transform", transform.getProjectedTransformation());
texture.bind(); // { glBindTexture(GL_TEXTURE_2D, m_ID); }
glEnable(GL_TEXTURE_2D);
mesh.draw(); // See below for details.
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
window.update();
}
return 1;
}
Die mesh.draw() -Methode:
void Mesh::draw()
{
//std::cout << m_Index << std::endl;
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const void*)sizeof(Vector3f));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, m_SizeIndices, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
}
Und endlich, meine Vertex und Fragment-Shader jeweils:
#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
uniform mat4 transform;
out vec2 coords;
void main()
{
gl_Position = transform * vec4(position, 1.0f);
coords = texCoord;
}
#version 330 core
in vec2 coord;
uniform sampler2D sampler;
void main()
{
gl_FragColor = texture2D(sampler, coord.xy);//vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
Als zusätzliche Informationen werden die folgenden OpenGL Parameter/bei der Initialisierung aktiviert:
würdevoid Window::init()
{
// Set viewport size
glfwGetFramebufferSize(m_Window, &m_Width, &m_Height);
glViewport(0, 0, m_Width, m_Height);
// Set vsync
glfwSwapInterval(0);
// Set face culling and depth test.
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
// Enable 2D textures
glEnable(GL_TEXTURE_2D);
// Enable gamma correction
glEnable(GL_FRAMEBUFFER_SRGB);
}
Jede Hilfe sehr geschätzt.
Vielen Dank!