2017-11-03 4 views
1

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ürde
void 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!

Antwort

1

Annnnd Ich habe mein Problem gefunden. Zeigt, dass wenn Sie zu lange auf Ihren eigenen Code starren, Sie die offensichtlichsten Dinge verpassen.

Das Problem war in meinem Shader. Der Vertex Shader wurde

Ausgeben
vec2 coords 

Aber der Fragment-Shader für wartete

vec2 coord 

Sobald ich die Variablennamen geändert, angepasst bekam ich meine Textur.