2013-06-25 4 views
-6

Должен ли я использовать GL_COLOR_ARRAY для преобразования цветов в VBO? Я использовал это в своем коде. Кроме того, для преобразования вершин в VBO я использовал GL_ARRAY_BUFFER. Целью является передача переменных цвета и вершин в VBO (GPU). Я смущен, я сделал все, чтобы запустить эту программу, ноOpenGL Vertex Buffer Object

still gives me a segmentation fault. 

    GLuint vboIds[2]; 
    QVector<QVector3D> vertices; 
    float* colors; 

инициализации: Длина массива вершин (6 * ANGLE_COUNT = 360 * RANGE_COUNT = 100)

initializeGLFunctions(); 
// Generate 2 VBOs 
glGenBuffers(2, vboIds); 

// Transfer vertex data to VBO 0 
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 
glBufferData(GL_ARRAY_BUFFER, 6 * ANGLE_COUNT * RANGE_COUNT * sizeof(QVector3D), vertices.constData(), GL_STATIC_DRAW); 

// Transfer index data to VBO 1 
glBindBuffer(GL_COLOR_ARRAY, vboIds[1]); 
glBufferData(GL_COLOR_ARRAY, 6 * ANGLE_COUNT * RANGE_COUNT * sizeof(GLushort), colors, GL_STATIC_DRAW); 

До сих пор, Я инициализировал вершины как буфер массива до указанной длины, а также буфер цветов.

Rendering Функция:

glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); 

int vertexLocation = shaderProgram->attributeLocation("vertex"); 
shaderProgram->enableAttributeArray(vertexLocation); 
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 6 * ANGLE_COUNT * RANGE_COUNT * sizeof(vertices.constData()), (const void *)0); 

int Color = shaderProgram->attributeLocation("color"); 
shaderProgram->enableAttributeArray(Color); 
glVertexAttribPointer(Color, 2, GL_FLOAT, GL_FALSE, 6 * ANGLE_COUNT * RANGE_COUNT *sizeof(colors), 0); 

//glDrawElements(GL_TRIANGLES, 6 * ANGLE_COUNT * RANGE_COUNT, GL_UNSIGNED_SHORT, 0); 

glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 

Я не понимаю, почему эта программа не может работать. Кроме того, когда я передаю цвета и вершины в VBO, представьте, теперь я хочу изменить значение некоторых индексов переменных цветов, как я могу это сделать?

+3

* Может кто-нибудь исправить это пожалуйста. * ** НЕТ ** Пожалуйста, ознакомьтесь с правилами и предложениями перед публикацией. –

+0

Очень сложно сказать, что вы на самом деле пытаетесь сделать. Похоже, что существует большая путаница в различии между цветами и индексами вершин (однако такое недоразумение может возникнуть), и действительно трудно найти ответ, отличный от * «проконсультируйтесь с соответствующим учебным ресурсом OpenGL, чтобы устранить некоторые фундаментальные недоразумения» * , –

+0

Можете ли вы представить правильный ресурс OpenGL для меня, пожалуйста. –

ответ

0

Вам нужны три объекта буфера. Один для вершинных координат, один для вершинных индексов и один для ваших цветов. Обратите внимание, что буфер вершины должен иметь ту же длину, что и цветовой буфер. Размер индекса-буфера должен быть делимым на три, если вы рисуете треугольники. До сих пор в теории, теперь к коду:

// Transfer index data to VBO 1 
glBindBuffer(GL_COLOR_ARRAY, vboIds[1]); 
glBufferData(GL_COLOR_ARRAY, 6 * ANGLE_COUNT * RANGE_COUNT * sizeof(GLushort), colors, GL_STATIC_DRAW); 

//... 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); 

Использование GL_ARRAY_BUFFER вместо GL_COLOR_ARRAY. Вам нужен дополнительный буфер для ваших цветов, индекс-буфер (element-array-buffer) просто индексирует вершины (так называется связывание вершин с треугольниками).

Полный пример (я знаю только, как управлять перемежаемым буфером-макетом, поэтому я немного изменил настройку данных, также я не использую индексный буфер, так как я предполагаю, что вершины уже выстроены так, как треугольники будут окрашиваться):

struct vertexData 
{ 
    float x, y, z; 
    float r, g, b; 
}; 

//... 

size_t numVerts = 6 * ANGLE_COUNT * RANGE_COUNT; 
vertexData *verts = new vertexData[numVerts]; 

for(size_t i = 0; i < numVerts; i++) 
{ 
    verts[i].x = vertices[i][0]; 
    verts[i].y = vertices[i][1]; 
    verts[i].z = vertices[i][2]; 
    //I assume you have three floats per color per vertex 
    verts[i].r = colors[i*3+0]; 
    verts[i].g = colors[i*3+1]; 
    verts[i].b = colors[i*3+2]; 
} 

GLuint vboIds[1] = {0}; 
glGenBuffers(1, vboIds); //only one buffer needed 

// Transfer vertex data to VBO 0 
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 
glBufferData(GL_ARRAY_BUFFER, numVerts * sizeof(vertexData), verts, GL_STATIC_DRAW); 
delete[] verts; //no longer needed 


//... 


glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 

int vertexLocation = shaderProgram->attributeLocation("vertex"); 
shaderProgram->enableAttributeArray(vertexLocation); 
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(vertexData), NULL); 

int colorLocation = shaderProgram->attributeLocation("color"); 
shaderProgram->enableAttributeArray(Color); 
glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE, sizeof(vertexData), (const char*)(sizeof(float)*3)); 

glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDrawArrays(GL_TRIANGLES, 0, numVerts); 

Я надеюсь, что это поможет вам понять основные основы работы наноэлектронных вершинных буферов и т.д. Пожалуйста, не копируйте & вставить этот код в ваш кодовый но попытаться понять, что я здесь. Затем перепишите свой код, он переполнен, что показывает мне, что вы не понимаете основных принципов.

+0

* «Используйте' GL_ELEMENT_ARRAY_BUFFER' вместо 'GL_COLOR_ARRAY' * * - Нет, используйте' GL_ARRAY_BUFFER' вместо 'GL_COLOR_ARRAY'. * «Надеюсь, это поможет вам понять основные принципы вершинных буферов». - Боюсь, что этого не происходит. –

+0

, пожалуйста, см. Ответ выше, я не сделал, как вставить его здесь. –

+0

Я получаю сообщение об ошибке при вызове функции glMapBuffer(): ошибка: «glMapBuffer» не был объявлен в этой области. Я ошибся в googled, но я не нашел ничего, кроме одного потока, который был запутан. Кто-нибудь знает, какую библиотеку добавить? Но я думаю, что вместо этого я должен добавить #define. Но не знаю, что добавить. –