Простой Современный OpenGL Hello World - PullRequest
0 голосов
/ 24 августа 2018

Я хочу создать простую современную программу OpenGL hello world. У меня уже есть некоторый опыт работы с современным OpenGL. Однажды я даже собрал свои собственные шейдеры и все такое. Теперь я хочу использовать некоторые более современные функции, такие как glVertexAttribPointer. Код компилируется, но все, что я получаю, это черный экран. Ни один треугольник не появляется. Это какая-то проблема с моей видеокартой или я делаю что-то не так?

Я читал этот урок: https://www.youtube.com/watch?v=Dyue3MzJDss&index=5&list=PLRwVmtr-pp06qT6ckboaOhnm9FxmzHpbY

Когда я смотрю в комментариях, многие говорят, что все, что они получают, это черный экран.

#include <iostream>
#define GL3_PROTOTYPES 1
#include <GL/glew.h>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <vector>
#define BUFFER_OFFSET(i) ((char *)NULL + (i))

GLuint vbo;
GLuint w=0;
float f[]={0.0, 1.0, -1.0, -1.0, 1.0, -1.0};    //vertex array

void init()
{
  glClearColor(0,0,0,1);
  glEnable(GL_DEPTH_TEST);
  glGenBuffers(1,&vbo); //generate an index for the vertexbuffer
  glBindBuffer(GL_ARRAY_BUFFER,vbo);    //use vbo as ARRAY_BUFFER
  glBufferData(GL_ARRAY_BUFFER,sizeof(f),f,GL_STATIC_DRAW);//fill up the array with vertex and color-data
  glEnableVertexAttribArray(w);
  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
}


void display()
{
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glDrawArrays(GL_TRIANGLES,0,3);       //draw it
}

int main()
{
  SDL_Init(SDL_INIT_EVERYTHING);
  SDL_SetVideoMode(640,480,32,SDL_OPENGL);
  glewInit();
  Uint32 start;
  SDL_Event event;
  bool running=true;
  init(); 
  bool b=false;
  while(running)
  {
    start=SDL_GetTicks();
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:
                running=false;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        running=false;
                        break;
                }
                break;

        }
    }
    display();
    SDL_GL_SwapBuffers();
    if(1000.0/30>SDL_GetTicks()-start)
        SDL_Delay(1000.0/30-(SDL_GetTicks()-start));
  }
  glDeleteBuffers(1,&vbo);
  SDL_Quit();
}
...