2017-01-25 6 views
0

Ich erstelle ein OpenGL-Programm, das einfach ein Dreieck erstellt und es auf dem Bildschirm zeichnet. Ich habe eine Klasse namens Drawable erstellt, die die Draw-Funktion enthält, sowie die VAO & VBO-Objekte, die verwendet werden. Ich habe auch eine Triangle-Klasse erstellt, die von der Drawable-Klasse erbt. In der Klasse "Triangle" habe ich einen Konstruktor, der ein Array von Punkten und ein einzelnes Array mit einer Farbe verwendet, und initialisiert den VAO & VBO (der von Drawable geerbt wurde) mit diesen Daten.Warum wird mein Dreieck-Objekt nicht gezeichnet?

In meiner Hauptfunktion ich das Dreieck mit Punkt und Farbdaten initialisieren und dann die Zeichenfunktion auf dem Objekt Dreieck nennen (dies ist Zeichenfunktion in Drawable). Letztendlich öffnet sich jedoch das Fenster und das Dreieck wird nicht gezeichnet. Ich habe einen einfachen Konstruktor in der Drawable-Klasse, und wenn ich das Objekt mit diesem Konstruktor initialisiere und die draw-Funktion aufruft, wird das Objekt angezeigt, so dass ich nicht an meine draw-Funktion denke. Das einzige, woran ich denken kann, ist, dass, weil ich auf die VBO-Objekte VAO & zugreife, sie vielleicht gar nicht initialisiert werden, aber ich weiß nicht, wie ich das überprüfen soll.

Drawable.h

class Drawable 
{ 
    public: 
     Drawable(); 

     void draw(); 
     GLuint objBuffer, VAO, program; 
     std::string vShaderName, fShaderName; 
     bool isUniform = false; 
     int numVertices = 0; 
     vec4 uniformColorVec; 
}; 

Drawable.cpp

Drawable::Drawable() 
{} 

void Drawable::draw() 
{ 
     GLuint program = InitShader(vShaderName.c_str(), fShaderName.c_str()); 
     glUseProgram(program); 
     GLuint color_loc = glGetUniformLocation(program, "color"); 

     glBindVertexArray(VAO); 

     glUniform4fv(color_loc, 1, uniformColorVec); 
     glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices); 

} 

Triangle.cpp

Triangle::Triangle(vec4 triPoints[3], vec4 color) 
{ 
    uniformColorVec = color; 

    vShaderName = "vshader00_v150.glsl"; 
    fShaderName = "fshader00_v150.glsl"; 
    numVertices = 3; 

    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
    glGenBuffers(1, &objBuffer); 

    glBindBuffer(GL_ARRAY_BUFFER, objBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triPoints), triPoints, GL_STATIC_DRAW); 

    program = InitShader(vShaderName.c_str(), fShaderName.c_str()); 
    glUseProgram(program); 

    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    GLuint color_loc = glGetUniformLocation(program, "color"); 

    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    glUniform4fv(color_loc, 1, uniformColorVec); 

} 

Hauptdatei

/* All the OpenGL windowing is intialized but I won't 
    include that since I know it's fine due to other objects being drawn 
    correctly */ 


vec4 triPoints2[3] = { 
    vec4(0.0, 0.0, 1.0, 1.0), 
    vec4(-0.75, -0.75, 1.0, 1.0), 
    vec4(0.0, -0.75, 1.0, 1.0) 
}; 

vec4 blue_opaque = vec4(0.0, 0.0, 1.0, 1.0); 

Triangle t; 
t = Triangle(triPoints2, blue_opaque); 

glClearColor(1.0, 1.0, 1.0, 1.0); 

glClear(GL_COLOR_BUFFER_BIT); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 

t.draw(); 

glFlush(); 
+1

Was 'glGetError' sagt? Ich rate auch davon ab, 'GL_TRIANGLE_FAN' zu verwenden, weil es Geschichte ist. – ybungalobill

+0

@ybungalobill 'glGetError' zeigt eine 0, daher werden keine Fehler gemeldet. – user3358152

+1

Was passiert, wenn Sie das 'Dreieck t ändern; t = Dreieck (triPoints2, blue_opaque); 'Linien zu' Dreieck t (triPoints2, blue_opaque); '? – ybungalobill

Antwort

2

Ihre Funktion erhält ein vec4 triPoints[3]-Argument, aber nach C++ - Regeln entspricht sie vec4 *triPoints als Funktionsargument. Als Ergebnis sizeof(triPoints) ist nicht die Größe der Daten, sondern die Größe des Zeigers selbst (entweder 4 oder 8). Stattdessen ändern Sie es in:

glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW); 
+0

Vielen Dank! Ich schätze deine Hilfe sehr. – user3358152

Verwandte Themen