2011-08-08 6 views
2

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

Vertex Shader:

#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); 
} 

Фрагмент Shader:

#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); 

Вид чертежа установлен на t он размер окна, как 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)), но также ничего не получил. Как определить, где проблема?

+0

Если он все еще не работает с 'glDrawArrays' (поскольку вы только визуализируете один экземпляр), то это не проблема instancing. –

ответ

4
glBindVertexArray(vao); 
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1); 

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

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

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

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

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

+0

Я проверяю с помощью glGetError(), но во время рендеринга код ошибки отсутствует. Я пытаюсь сделать vertecies, которые у меня есть в моем вершинном шейдере. – shadeglare

+0

Я только что пытался установить данные для своего VAO, но ничего не меняется. – shadeglare

+0

@MaxFX, так что это не решило вашу проблему? –

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

  • Нет связанных вопросов^_^