2014-08-30 5 views
0

Я пытаюсь отобразить vbo с 7 компонентами (переплетение справа?). Первые 4 представляют собой x, y, z, w (w - коэффициент масштабирования), а остальные 3 должны использоваться для регулировки яркости в шейдере фрагмента.Точечный рендеринг, чередующийся VBO

Это, как я создать VBO:

std::vector<float> pointCloudData; 
while(endOfFile != true){ 

    ... // a lot of textfile handling/reading before, total of 100361 coordinates read. 

    for (int i = 0; i < 4; i++){ 
     pointCloudData.push_back(xyzFromFile[i]); //store the read x y z w coordinate 
    } 
    // store extra data 
    // right now im setting everything to 1.f just to see results in fragment shader! 
    pointCloudData.push_back(1.f); 
    pointCloudData.push_back(1.f); 
    pointCloudData.push_back(1.f); 
} 

v_size = pointCloudData.size(); 

// create vbo 
glGenVertexArrays(1, &_vaoID); 
    glGenBuffers(1, &_vboID); 
    glBindVertexArray(_vaoID); 
    glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
    glBufferData(GL_ARRAY_BUFFER, v_size*sizeof(GLfloat), &pointCloudData[0], GL_DYNAMIC_DRAW); 
glBindVertexArray(0); 

В методе визуализации:

glBindVertexArray(_vaoID); 
    glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
    glEnableVertexAttribArray(positionAttrib); 

    GLsizei stride = sizeof(GLfloat) * 7; 
    glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, stride, (void*)0); // x y z 
    glVertexAttribPointer(brightnessDataAttrib, 3, GL_FLOAT, GL_FALSE, stride, (void*)(4 * sizeof(GLfloat))); // remaining data 

    glDrawArrays(GL_POINTS, 0, vertsToDraw); 
    glDisableVertexAttribArray(positionAttrib); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

Vertex Shader:

layout(location = 0) in vec4 in_position; 
layout(location = 2) in vec3 in_brightness; 

out vec3 vs_brightness; 
void main() 
{ 
    vs_brightness = in_brightness; 
    gl_Position = ViewProjection * vs_position; 
} 

Фрагмент шейдеры:

in vec3 vs_brightness; 
void main(void) 
{ 
    diffuse = vec4(vs_brightness[1],0,0,1); // at this point i just want SOMETHING to show up 
} 

Если это плохой способ, как я могу сделать это по-другому? Как отправить оставшиеся 3 скаляра в шейдер фрагмента? (в общей сложности 3 * 100361 скаляров).

+0

Мне непонятно, каков ваш вопрос. Работает ли опубликованный код, и вы ищете обратную связь? Или у вас проблемы с этим? Если да, какова конкретная проблема? –

+0

Моя особая проблема в том, что vs_brightness (см. Frag) имеет нулевые значения, переданные ей. Таким образом, в моем проекте есть что-то очень неудачное. Что это, я понятия не имею, я подозреваю, что это может быть параметр «stride» ... но действительно im clueless ... – mike

ответ

1

Это в основном выглядит нормально. Тем не менее, вы никогда не включаете атрибут второй вершины. Вы будете нуждаться в этом где-то в коде установки:

glEnableVertexAttribArray(brightnessDataAttrib); 

Это предполагает, что positionAttrib является 0 и brightnessDataAttrib является 2, соответствующие места в вершинном шейдере.

Несмотря на то, что проблема с корректностью, вы не пользуетесь преимуществом VAO. Во время настройки вы создаете и связываете VAO, но затем не настраиваете какое-либо состояние, которое отслеживается в VAO. Вместо этого у вас есть все это во время розыгрыша. Это нарушает цель использования VAO. Идея заключается в том, что она поддерживает все состояние установки вершин, а затем вы можете получить все необходимое состояние для рисования, просто привязывая VAO снова.

Так в коде установки, лучше структура выглядит следующим образом:

glBindBuffer(GL_ARRAY_BUFFER, vboID); 
glBufferData(GL_ARRAY_BUFFER, ...); 

glBindVertexArray(vaoID); 
glEnableVertexAttribArray(...); 
glVertexAttribPointer(...); 
glBindVertexArray(0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

Затем в коде розыгрыше, вам нужно только это:

В glBindVertexArray(0) вызовы не действительно необходимы если вы используете VAO во всем своем коде, так как все будут привязывать необходимое VAO до рисования. Некоторым людям нравится иметь явный unbind на всякий случай, если другие части кода хотят визуализировать без VAO. Но в противном случае это пустая трата.

+0

Благодарим вас за ответ Reto. Когда вы говорите «код установки», вы имеете в виду, как я создаю свое vbo? Так баистически я делаю все в инициализации, а затем под методом Render() мне нужно делать только эти три строки? Я пытаюсь это сделать. – mike

+0

Да, точно. Я подозреваю, что ваша основная проблема - это часть в начале моего ответа, хотя отсутствует «glEnableVertexAttribArray()». –

+0

Это заставило его работать !!! Я вытягивал свои волосы за последние несколько дней, чтобы подумать о том, что маленький ... дьявол лежит в деталях. Я сделаю предложенную вами оптимизацию. Бесконечно благодарен! – mike

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