2015-10-08 3 views
0

Итак, я пытаюсь создать базовый класс «Drawable», который обрабатывает много чертежа для меня в фоновом режиме, и я хочу использовать современный OpenGL (без начального и конечного операторов). Когда я запускаю draw(), я просто получаю пустой экран.OPENGL: Квадратный класс с использованием VBO

Я запустил отладчик и проверил, мой массив правильно инициализирован 3xFLOAT для позиции и 4xFLOAT для цвета. Любая идея, что происходит не так? Я очень новичок в этой библиотеке. Мой пример пытается нарисовать красный куб на (+ -0.5, + -0.5, 0.0), поэтому массив indexData - это просто {0, 1, 2, 3}.

#define DRAWABLE_VERTEX_DEPTH 3 
#define SIZE_OF_VERTEX_ELEMENT sizeof(GLfloat) 
#define VERTEX_SIZE (DRAWABLE_VERTEX_DEPTH * SIZE_OF_VERTEX_ELEMENT) 
#define DRAWABLE_COLOR_DEPTH 4 
#define SIZE_OF_COLOR_ELEMENT sizeof(GLfloat) 
#define COLOR_SIZE (DRAWABLE_COLOR_DEPTH * SIZE_OF_COLOR_ELEMENT) 
#define INDEX_SIZE sizeof(GLushort) 
#define DRAWABLE_STRIDE (VERTEX_SIZE + COLOR_SIZE) 

inline Drawable(/*Arguments omitted for brevity...*/) 
    { 
     //Standard initialization omitted.... 

     glGenBuffers(1, &vboID); 
     glGenBuffers(1, &vioID); 
     glGenVertexArrays(1, &vaoID); 

     glBindBuffer(GL_ARRAY_BUFFER, vboID); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID); 

     glBufferData(GL_ARRAY_BUFFER, (VERTEX_SIZE + COLOR_SIZE) * vertexCount, vertexData, drawType); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, INDEX_SIZE * indexCount, indexData, drawType); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

     //Generate Vertex Array 

     glBindVertexArray(vaoID); 
     glBindBuffer(GL_ARRAY_BUFFER, vboID); 
     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 
     glVertexAttribPointer(0, DRAWABLE_VERTEX_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, 0); 
     glVertexAttribPointer(1, DRAWABLE_COLOR_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, (GLbyte*)VERTEX_SIZE); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID); 
     glBindVertexArray(0); 
    } 

    inline void draw() 
    { 
     glBindVertexArray(vaoID); 
     glDrawElements(drawMode, indexCount, GL_UNSIGNED_SHORT, NULL); 
     glBindVertexArray(0); 
    } 

GLSL Vertex Shader:

#version 430\r\n 

in layout(location=0) vec3 inPosition; 
in layout(location=1) vec4 inColor; 
out vec4 outVertexColor; 

void main() 
{ 
    gl_Position = vec4(inPosition, 1.0); 
    outVertexColor = inColor; 
} 

GLSL фрагмент Shader:

#version 430\r\n 

in vec4 outVertexColor; 
out vec4 outFragmentcolor; 

void main() 
{ 
    outFragmentcolor = outVertexColor; 
} 
+0

Вы должны вызвать 'glEnableClientState (GL_VERTEX_ARRAY);' перед вызовом 'glBindVertexArray (vaoID);' и 'glDisableClientState (GL_VERTEX_ARRAY);' после 'glBindVertexArray (0);'. – ProXicT

+0

Thx для ответа! Я просто добавил это, но это, казалось, не имело никакого эффекта. Что именно это делает? И нужно ли мне это в обоих местах, где я привязываю Vertex Array? – guitar80

+2

Я просто быстро просмотрел ваш код и нашел это пропавшим. Он в основном включает/отключает возможность, указанную в параметре. Попробуйте поставить 'glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); вместо этого. И не забудьте снова отключить его. – ProXicT

ответ

2

Помимо вопросов, упомянутых в комментариях, ваш массив индекса GLushort (беззнаковое 16 бит), в то время как ваш вызов draw указывает GL_UNSIGNED_INT (без знака 32 бит). Замените GL_UNSIGNED_SHORT.

+0

Помимо вопросов, упомянутых в комментариях? Эта точная проблема уже упоминалась в комментариях. –

+0

Да, я изменил это, но это не сработает. Это было более позднее изменение, которое я пытался использовать, чтобы исправить ситуацию. Я думаю, что это проблема с моими массивами Vertex или позволяет ... Любая идея? Записывают ли VArrays все сохраненные разрешения/привязки, когда они связаны? – guitar80

+0

Ugh .. поэтому в моем шейдерном коде отсутствовала точка с запятой, а также эта проблема. Благодаря тонну! * Чувство дурака * – guitar80

 Смежные вопросы

  • Нет связанных вопросов^_^