[gelöst]OpenGL Sprite/Renderer Class C++
-
Ich befasse mich jetzt seit einigen Tagen mit OpenGL ( kenne mich mit C++ auch nur "halbwegs" aus ) und bin in einer Sackgasse gelandet. Ich versuche eine Klasse zu schreiben in die ich Position/ Texturepfad und Vertices ( in einem Array ) übergebe, und die Klasse packt das Zeug dann in eine VBO / VAO und im Event Loop benutze ich dann diese VBOs/ VAOs um die Sprite zu zeichnen. Ich habe lange im Netz gesucht und habe nichts wirklich gutes gefunden, wo es verständlich erklärt wurde.
Dies hier ist mein Versuch:
"sprite.h" :[...] class Sprite { private: Shader& m_shader; GLuint m_vbo; GLuint m_vao; public: Sprite(GLfloat* verts, int size, const char* textpath, Shader& shader); ~Sprite(); private: GLfloat* m_vertices; int m_size; public: inline void bindVAO() const { glBindVertexArray(m_vao); } inline void bindVBO() const { glBindBuffer(GL_ARRAY_BUFFER, m_vbo); } [...]
"sprite.cpp"
Sprite::Sprite(GLfloat* verts, int size, const char* textpath, Shader& shader) : m_shader(shader) { m_vertices = new GLfloat[size]; for (int i = 0; i < size; i++) m_vertices[i] = verts[i]; m_size = size; glGenBuffers(1, &m_vbo); glGenVertexArrays(1, &m_vao); bindVAO(); bindVBO(); glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, GL_STATIC_DRAW); GLint posAttrib = glGetAttribLocation(m_shader.getShaderID(), "position"); glEnableVertexAttribArray(posAttrib); glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); GLint colAttrib = glGetAttribLocation(m_shader.getShaderID(), "color"); glEnableVertexAttribArray(colAttrib); glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); GLint texAttrib = glGetAttribLocation(m_shader.getShaderID(), "texcoord"); glEnableVertexAttribArray(texAttrib); glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat))); GLuint tex; glGenTextures(1, &tex); int width, height; unsigned char* image = SOIL_load_image(textpath, &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindVertexArray(0); }
main.cpp
[...] int main() { [...] Sprite sprite1(vertices, 288, "sample.png", shaderProgram); [...] while (!window.closed()) { sprite1.bindVAO(); sprite1.bindVBO(); glm::mat4 model; model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f)); model = glm::rotate(model, glm::radians(0.0f), glm::vec3(1.0f, 0.0f, 0.0f)); GLint uniTrans = glGetUniformLocation(shaderProgram.getShaderID(), "model"); glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); sprite1.unbindVAO(); window.update(); } [...] }
Ich vermute dass mit der VBO und oder VAO etwas nicht stimmt oder dass der Shader nicht richtig übergeben wird und so wie ich mich kenne mache ich einen relativ dummen Fehler .... Ich hoffe das mir jemand helfen kann und mir erläutern kann was ich falsch mache bzw. wie ich es richtig mache.
mfg.
-
glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, GL_STATIC_DRAW);
Der zweite Parameter soll wohl eher sowas wie
m_size * sizeof GLfloat
sein?
-
Vielen dank, habe mir nochmal den Artikel auf "opengl.org" durch gelesen und du hast vollkommen recht. Hat das Problem gelöst.