Рисование экземпляра массива OpenGL - PullRequest
2 голосов
/ 08 августа 2011

У меня есть простая программа OpenGL, и я пытаюсь нарисовать экземплярный массив, который хранится в вершинном шейдере.Я использую два следующих шейдера для рендеринга:

Вершинный шейдер:

#version 330 core

uniform mat4 MVP;

const int VertexCount = 4;
const vec2 Position[VertexCount] = vec2[](
vec2(-100.0f, -100.0f),
vec2( -100.0f, 100.0f),
vec2( 100.0f, -100.0f),
vec2(100.0f, 100.0f));

void main()
{   
    gl_Position = MVP * vec4(Position[gl_VertexID], 0.0, 1.0);
}

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

#version 330 core
#define FRAG_COLOR      0

layout(location = FRAG_COLOR, index = 0) out vec4 Color;

void main()
{
    Color = vec4(0, 1, 0, 1); //let it will be green.
}

После того, как я скомпилировал и проверил эти шейдеры, ясоздайте объект массива вершин и нарисуйте его, как треугольные полосы:

glUseProgram(programHandle); //handle is checked and valid.
glBindVertexArray(vao);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1);

В окне просмотра окна установлен размер окна, подобный glViewport (0, 0, 800, 600).Я передаю MVP простую орфографическую матрицу с кодом:

glUniformMatrix4fv(handle, 1, GL_FALSE, (GLfloat*)&matrix); //handle is checked and valid

, где матрица была инициализирована:

Matrix::CreateOrthographicOffCenter(-200, 200, -200, 200, 1.0f, -1.0f, &matrix);

...
void Matrix::CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane, Matrix* matrix)
{
memset(matrix, 0, sizeof(Matrix));
    matrix->M11 = 2.0f / (right - left);
    matrix->M14 = (-right - left) / (right - left);
    matrix->M22 = 2.0f / (top - bottom);
    matrix->M24 = (-top - bottom) / (top - bottom);
    matrix->M33 = 1.0f / (zFarPlane - zNearPlane);
    matrix->M34 = (-zNearPlane) / (zFarPlane - zNearPlane);
    matrix->M44 = 1.0f;
}

Проблема в том, что на моем экране нет треугольных полос.Я пытался нарисовать вершину без матрицы MVP (gl_Position = vec4 (Position [gl_VertexID], 0.0, 1.0)), но также ничего не получил.Как определить, где проблема?

1 Ответ

4 голосов
/ 08 августа 2011
glBindVertexArray(vao);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1);

А что именно хранится в этой ВАО? Я предполагаю, что ваш ответ будет "ничего".

Если это так, то вы столкнулись с несколькими проблемами. Если это контекст совместимости (или GL 2.1 или ранее), то OpenGL не позволяет визуализировать с VAO, в которой ничего нет. То есть, вы не можете выполнить рендеринг со всеми отключенными атрибутами. Вы получите ошибку GL_INVALID_OPERATION.

Однако, если вы находитесь в базовом контексте 3.2 или выше, то вы можете рендерить с отключенным VAO.

Конечно, именно об этом говорится в спецификации OpenGL. Драйверы NVIDIA говорят, что вы можете выполнять рендеринг с отключенным VAO как по ядру, так и по совместимости Драйверы ATI говорят, что вы не можете визуализировать с отключенным VAO в и ядре и совместимости.

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

...