2014-05-15 3 views
2

J'ai du mal à rendre un triangle simple. Le code ci-dessous compile et s'exécute, sauf qu'il n'y a pas de triangle; seulement un fond noir.Le triangle ne rend pas

GLuint VBO; 

static void RenderSceneCB() 
{ 
    //glClear sets the bitplane area of the window to values previously selected by glClearColor, glClearDepth, and glClearStencil. 
    glClear(GL_COLOR_BUFFER_BIT); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 

    //swaps the buffers of the current window if double buffered. 
    glutSwapBuffers(); 
} 

static void InitializeGlutCallbacks() 
{ 
    glutDisplayFunc(RenderSceneCB); 
} 

static void CreateVertexBuffer() 
{ 
    Vector3f Vertices[3]; 
    Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f); 
    Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f); 
    Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f); 

    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowSize(1024, 768); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Tutorial 02"); 

    InitializeGlutCallbacks(); 

    // Must be done after glut is initialized! 
    GLenum res = glewInit(); 
    if (res != GLEW_OK) { 
     fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res)); 
     return 1; 
    } 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    CreateVertexBuffer(); 

    glutMainLoop(); 

    return 0; 
} 
+4

Je suis assez nouveau pour OpenGL, mais cela ressemble à la "nouvelle" OpenGL où vous devez avoir des shaders. Pour un très bon tutoriel, je recommande [celui-ci] (http://arcsynthesis.org/gltut/index.html), et vous pourriez vouloir lire le ["Bonjour le triangle"] (http://arcsynthesis.org/gltut /Basics/Tutorial%2001.html) chapitre. –

+0

Peut-être essayer de changer la couleur de l'écran entier en utilisant 'glClearColor()' et appelez cette fonction après glClear 'glLoadIdentity' – mr5

+0

@RetoKoradi - Merci .... Cela a fonctionné! – SINGULARITY

Répondre

3

Puisque vous ne disposez pas d'un shaders, OpenGL ne sait pas comment interpréter votre attribut sommet 0, car il ne connaît que sur la position, la couleur, etc. et non sur les attributs génériques. Notez que cela peut fonctionner sur certains GPU car ils vont mettre en correspondance les attributs génériques avec les mêmes "slots", et zéro sera alors interprété comme position (typiquement NVidia est moins stricte avec ces problèmes).

Vous pouvez utiliser MiniShader, il suffit de mettre le code suivant après CreateVertexBuffer();:

minish::InitializeGLExts(); // initialize shading extensions 
const char *vs = 
    "layout(location = 0) in vec3 pos;\n" 
    // the layout specifier binds this variable to vertex attribute 0 
    "void main()\n" 
    "{\n" 
    " gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);\n" 
    "}\n"; 
const char *fs = "void main() { gl_FragColor=vec4(.0, 1.0, .0, 1.0); }"; // green 
minish::CompileShader(vs, fs); 

Notez que j'ai écrit que du haut de ma tête, dans le cas où il y a des erreurs, s'il vous plaît commentaire.

+0

Puisqu'il a été identifié comme un doublon, peut-être aurait-il été préférable d'ajouter votre réponse à la question originale? J'ai différé le code par rapport à celui de l'ancienne question, et il est absolument identique. –

+0

@RetoKoradi Vous avez raison, je n'ai pas remarqué le doublon, la question a été signalée après que j'ai écrit ma réponse. J'ai étendu ma réponse là http://stackoverflow.com/questions/23097007/how-can-i-make-opengl-draw-something-using-vbos-in-xcode/23696380#23696380. –