2016-05-15 7 views
0

Ich lerne gerade OpenGL 3.3 mit C++ und GLFW (und SOIL zum Laden von Bilddateien zum Erstellen von Texturen). Ich habe ein Batch-Rendering-System implementiert, das Vertex-Informationen übernimmt, die VBO-Daten einer Puffervariablen zuordnet, die übermittelten Vertex-Informationen in jeden Puffer in diesen Puffer schreibt und diesen Frame rendert.OpenGL 3.3 keine Textur wird gerendert (schwarze Textur, C++, GLFW/SOIL)

Die renderer.cpp sieht wie folgt aus: http://pastebin.com/N6nWdew6 während die VertexData Struktur im renderer.hpp wie folgt definiert ist:

struct VertexData { 
    VertexData() 
     : vertex(glm::vec3(0.0f, 0.0f, 0.0f)), 
      color(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)), 
      texCoord(glm::vec2(0.0f, 0.0f)), 
      tid(0) {}; 

    VertexData(glm::vec3 vertex, glm::vec4 color, glm::vec2 texCoord, GLuint tid) 
     : vertex(vertex), 
      color(color), 
      texCoord(texCoord), 
      tid(tid) {}; 

    ~VertexData() {}; 

    glm::vec3 vertex; 
    glm::vec4 color; 
    glm::vec2 texCoord; 
    GLuint  tid; 
}; 

Jetzt einreichen und Rendering tatsächliche Ecken, Farbinformation, Texturkoordinaten usw. scheint Arbeit, aber die Textur wird immer noch nicht gerendert, alles, was ich bekomme, ist ein schwarzes Quadrat. Die wichtigsten Bits der tatsächlichen Vorlage in der Hauptschleife wie folgt aussehen (Achtung: sieht schlecht aus, nur zu Testzwecken, ich versuchte es das beste Produkt zu verkürzen konnte ich):

[...] 

/*Static variables in the window class, just for testing purposes*/ 
Shader*     Window::_exampleShader = nullptr; 
Texture*    Window::_exampleTexture = nullptr; 
Renderer::VertexData Window::vA; 
Renderer::VertexData Window::vB; 
Renderer::VertexData Window::vC; 
Renderer::VertexData Window::vD; 

[...] 

/*Initialization in the window constructor*/ 
_exampleShader = new Shader("../src/glsl/basicVertex.glsl", "../src/glsl/basicFragment.glsl"); 
_exampleTexture = new Texture("../res/test.png"); 

/*TOP LEFT*/ 
vA.vertex  = glm::vec3(-0.5f, 0.5f, 0.0f); 
vA.color  = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); 
vA.texCoord  = glm::vec2(0.0f, 1.0f); 
vA.tid   = _exampleTexture->getTextureID(); 

/*TOP RIGHT*/ 
vB.vertex  = glm::vec3(0.5f, 0.5f, 0.0f); 
vB.color  = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); 
vB.texCoord  = glm::vec2(1.0f, 1.0f); 
vB.tid   = _exampleTexture->getTextureID(); 

/*BOTTOM LEFT*/ 
vC.vertex  = glm::vec3(-0.5f, -0.5f, 0.0f); 
vC.color  = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); 
vC.texCoord  = glm::vec2(0.0f, 0.0f); 
vC.tid   = _exampleTexture->getTextureID(); 

/*BOTTOM RIGHT*/ 
vD.vertex  = glm::vec3(0.5f, -0.5f, 0.0f); 
vD.color  = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); 
vD.texCoord  = glm::vec2(1.0f, 0.0f); 
vD.tid   = _exampleTexture->getTextureID(); 

[...] 

/*Submission in the main loop*/ 
_exampleShader->bind(); 
_exampleTexture->bind(); 

_exampleShader->setUniformMat4("model_matrix", glm::mat4(1.0f)); 
_exampleShader->setUniformMat4("view_matrix", glm::lookAt(glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, 1.0f, 0.0f))); 
_exampleShader->setUniformMat4("projection_matrix", glm::perspective(ConversionUtils::convertFOV(90.0f), getAspectRatio(), 0.0001f, 100.0f)); 

Renderer::begin();  
    Renderer::submit(vC); 
    Renderer::submit(vA); 
    Renderer::submit(vB); 

    Renderer::submit(vC); 
    Renderer::submit(vD); 
    Renderer::submit(vB); 
Renderer::end(); 

glfwSwapBuffers(_window); 

[...] 

Wie Sie sehen können, habe ich Erstellen Sie einige Beispielscheitelpunktdaten, und senden Sie jeden einzelnen Rahmen. Nun werden die letzten Bits des Codes sind meine Vertex- und Fragment-Shader:

Vertex Shader:

#version 330 core 

layout(location = 0) in vec3 v_vertex; 
layout(location = 1) in vec4 v_color; 
layout(location = 2) in vec2 v_texCoord; 
layout(location = 3) in uint v_tid; 

out vec4 f_color; 
out vec2 f_texCoord; 
flat out uint f_tid; 

uniform mat4 model_matrix; 
uniform mat4 view_matrix; 
uniform mat4 projection_matrix; 

void main() { 
    f_color  = v_color; 
    f_texCoord = v_texCoord; 
    f_tid  = v_tid; 

    mat4 mvp = projection_matrix * view_matrix * model_matrix; 
    gl_Position = mvp * vec4(v_vertex, 1.0); 
} 

Fragment-Shader:

#version 330 core 

in vec4 f_color; 
in vec2 f_texCoord; 
flat in uint f_tid; 

out vec4 color; 

uniform sampler2D texSampler; 

void main() { 
    color = texture(texSampler, f_texCoord); 
} 

Das ist, was mit ich arbeite. Nun habe ich schon mal gegoogelt und sogar auf dem OpenGL-Kanal @freenode nachgefragt, aber mir konnte niemand dabei helfen. Ich habe veraltete Funktionen entfernt, indem ich das Core-3.3-Profil verwendet habe, sogar das vorwärtskompatible Profil, obwohl ich das nicht tun sollte. Andere Dinge, die ich bereits geprüft:

  • Ich bin nur ein Thread mit einem gültigen GL Kontext verwendet wird, so gibt es wahrscheinlich keine Probleme in Bezug auf „Verpacken eines OGL Objekt in einer C++ Klasse“
  • Beide Shader und die Textur gebunden sind; da die Textur-Sampler und die aktive Textur standardmäßig 0 sind, dass keine Probleme entweder
  • verursachen sollte ich eigentlich test.png richtig geladen bin (texture.cpp wenn Sie sich interessieren: http://pastebin.com/hWGTCe5C)
  • Ich bin nicht Mit der veralteten Funktionalität afaik werden selbst die SOIL-Funktionen, die veraltete Funktionen verwenden, nicht aufgerufen. das Bild über SDL2 und SDL2_image geladen, die ich vor dem Einschalten Bibliotheken haben, verursacht das gleiche Problem
  • Der Shader gültigen Texturkoordinaten (durch testete sie als Farben zum Quadrat Ausgeben Ich bin Rendering) bekommt
  • Weder der Shader noch der Compiler geben Sie mir alle Warnungen/Fehler, trotz der -Wall Compiler-Flag gesetzt wird, glGetError() nicht entweder

Weitere Informationen hilft, die nützlich sein könnten: ich habe dies auf Intel und Nvidia-GPUs getestet mit ihren neuesten Treibern auf Antergos (Arch) Linux (eins auf Wayland, eins auf X11). 64-Bit-Architektur. Neueste Versionen der Bibliotheken (GLFW3, SOIL, GLEW und GLM). Kompiliert mit Clang ++. Valgrind gibt mir auch keine nützliche Ausgabe.

Mir und dem IRC Chatroom sind die Ideen ausgegangen - was könnte das verursachen?

+0

Welche Textur Sampling-Parameter verwenden Sie? Ein klassischer Fehler besteht darin, 'GL_TEXTURE_MIN_FILTER' auf dem Standardwert zu belassen, der für MipMapped Sampling, aber nicht Mipmaps für die Textur ist. –

Antwort

0

Wie @RetoKoradi in seinem Kommentar sagte, übergeben Sie keine Parameter an Ihre Textur, daher ist Ihre Textur nicht vollständig.

glBindTexture(GL_TEXTURE_2D, texture_id); 
glTexImage2D(GL_TEXTURE_2D, 0, your_internal_format, width, height, 0, your_format, your_type, texture_pointer); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, your_behavior); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, your_behavior); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glGenerateMipmap(GL_TEXTURE_2D); 

oder

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); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

oder

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 

Sie hier weitere Informationen über Textur Vollständigkeit finden: OpenGL Common Mistakes

Versuchen in texture.cpp etwas wie hinzuzufügen. Beachten Sie, dass das Problem, auf das sich @RetoKoradi bezieht, in diesem Link angesprochen wird.

+0

Ihr zwei habt gerade mein Problem behoben! Vielen Dank, das hat mich verrückt gemacht! –