2016-09-25 2 views
0

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

Я создал класс «Mesh», где передаю массив GLfloats. Эти поплавки включены в VAO и VBO. Пока я создаю массив внутри конструктора (с целыми функциями инициализации), он отлично работает. Но если я хочу передать массив в качестве аргумента, OpenGL просто не будет рисовать. Я что-то забыл?

Вот мой основной код:

Mesh.cpp

Mesh::Mesh(GLfloat* vertices) 
{ 
    glGenVertexArrays(1, &m_vertexArray); 
    glBindVertexArray(m_vertexArray); 

     glGenBuffers(1, &m_vertexBuffer); 
     glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
      glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

      glEnableVertexAttribArray(0); 
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glBindVertexArray(0); 
} 

Mesh::~Mesh() 
{ 
    glDeleteVertexArrays(1, &m_vertexArray); 
} 

void Mesh::draw() 
{ 
    glBindVertexArray(m_vertexArray); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 
    glBindVertexArray(0); 
} 

main.cpp

[...]  

GLfloat vertices[] = { 
-0.5f, -0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
0.0f, 0.5f, 0.0f, 
-1.0f, -1.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 
-0.5f, 0.0f, 0.0f 
}; 

Mesh mesh(vertices); 

while (!mainWindow->isClosed()) 
{ 
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    shaders->bind(); 

    // here main functions: 

    mesh.draw(); 

    mainWindow->update(); 
} 
+0

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

ответ

2

Я хэндовера массив GLfloats

Нет, ты не " хэндовер "массив всего. Вы передали указатель . Указатели и массивы - это разные вещи на C++. Самое главное, массивы могут "decay" into pointers (that's what allows you to pass them to functions that take pointers), but when they do, all sizing information is lost.

sizeof(vertices) является размером GLfloat*. По всей вероятности, это либо 4, либо 8. Это, безусловно, не размер массива у вас в вызывающей функции.

Предпочтительным способом обработки этого является передача указателя и размера этой функции. Однако sizeof(vertices) будет числом байтов в массиве, а не количеством элементов массива.

Один из способов справиться с этим было бы получить std::vector, а не массив, через C++ 11:

std::vector<GLfloat> vertices = { 
-0.5f, -0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
0.0f, 0.5f, 0.0f, 
-1.0f, -1.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 
-0.5f, 0.0f, 0.0f 
}; 

Mesh mesh(vertices.data(), vertices.size()); 

В качестве альтернативы, вы можете рассчитать размер с некоторыми умными макросами:

#define ARRAY_COUNT(arr) (sizeof(arr)/sizeof(arr[0])) 

GLfloat vertices[] = { 
-0.5f, -0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
0.0f, 0.5f, 0.0f, 
-1.0f, -1.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 
-0.5f, 0.0f, 0.0f 
}; 

Mesh mesh(vertices, ARRAY_COUNT(vertices)); 

Или, если вы хотите использовать поумнее C++ 11 особенности:

template<typename T, size_t N> 
constexpr size_t array_count(T (&arr)[N]) {return N;} 

GLfloat vertices[] = { 
-0.5f, -0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
0.0f, 0.5f, 0.0f, 
-1.0f, -1.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 
-0.5f, 0.0f, 0.0f 
}; 

Mesh mesh(vertices, array_count(vertices)); 

Или йо и можно просто пропустить средние человек и использовать Ключевое Руководство support library class span C++:

Mesh::Mesh(gsl::span<GLfloat> vertices) 
{ 
    glGenVertexArrays(1, &m_vertexArray); 
    glBindVertexArray(m_vertexArray); 

    glGenBuffers(1, &m_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, vertices.size_bytes(), vertices.data(), GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glBindVertexArray(0); 
} 

GLfloat vertices[] = { 
-0.5f, -0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
0.0f, 0.5f, 0.0f, 
-1.0f, -1.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 
-0.5f, 0.0f, 0.0f 
}; 

Mesh mesh(vertices); 
Смежные вопросы