2013-04-26 5 views
0

Я использую векторов для хранения вершин и нормальные данныеglDrawArrays не рисует

vector<float> vertex; 
vector<float> normal; 

Например:

normal.push_back(-1); 
normal.push_back(0); 
normal.push_back(0); 

vertex.push_back(BARRIER_RADIUS); 
vertex.push_back(POLE_HEIGHT); 
vertex.push_back(-POLE_RADIUS); 

for (int i = POLE_POINTS, i >= 0; i--) 
{ 
    //add more vertex 
} 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, &vertex[0]); 
    glNormalPointer(GL_FLOAT, 0, &normal[0]); 

    glDrawArrays(GL_TRIANGLE_FAN, 0, vertex.size()); 

glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 
//Add some more + Draw some thing else the same way 

То, что я получил от этого ничего. он ничего не рисует на экране.

предыдущая версия, которая работает, состоит в следующем:

glNormal3f(-1, 0, 0); 
glBegin(GL_TRIANGLE_FAN); 
    glVertex3f(BARRIER_RADIUS, POLE_HEIGHT, -POLE_RADIUS); 
    for() 
    { 
     //add more vertex 
     glVertex3f(........); 
    } 
glEnd(); 

//draw more the same way 

Пойнт меня туда, где я не так.

+1

Есть много вещей в трубопроводе, которые могут пойти не так. Данные, вызовы рендеринга, шейдеры и т. Д. Вы уверены, что проблема в коде, который вы опубликовали? –

+0

Это единственная часть, о которой я могу думать. –

+0

Есть определенно больше деталей. Какой оконный менеджер вы используете? Как вы начинаете свои данные? Когда вы называете ваши функции рендеринга? Как вы читаете и строите свои шейдеры? Как выглядят шейдеры? Вы вообще используете шейдеры? –

ответ

3

Вы определили vertex как вектор float, но геометрическая вершина состоит из 3 поплавков, так что это рецепт путаницы. Число вершин не равно vertex.size(), но это одна треть. Я не уверен, что это ваша единственная проблема, но это проблема.

Вы должны иметь такое же число нормалей, что и вершины.

+0

Да, я это заметил. Однако это не проблема. : (такое же число нормалей, что и вершины? но в версии glVertex3f выше, все у меня есть 1 glNormal3f (-1, 0, 0) и цикл, содержащий glVertex3f, поэтому они не равны, не так ли? Я запутался. –

+0

@ThangDo * «Я в замешательстве» * - Ты не единственный (вообще не получил этот комментарий). Проблема в том, что вам нужно решить, что такое 'vertex' и' normal'. Из вашего кода это похоже, что они содержат отдельные поплавки, поэтому 3 последовательных значения составляют одну вершину. Но в этом случае вам нужно нарисовать только вершины vertex.size()/3' (в вызове 'glDrawArrays'). Другой вариант может заключаться в том, чтобы пусть 'vertex' и' normal' содержат фактические 3-элементные векторы (массивы или структуры POD, а не 'std :: vector', любыми средствами * не * 'std :: vector'!), и тогда у вас действительно будет 'vertex.size()' vertices. –

+0

@ThangDo И когда вы рисуете что-то с помощью 'glDrawArrays' или' glDrawElements', у вас действительно есть *, чтобы иметь такое же количество нормалей, как у вас есть позиции (если tha t, о чем вы говорили выше). Это безумие 'glBegin/glEnd'-comb-as-you-like больше не будет работать. –

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