2017-02-20 41 views
0

Я пытаюсь отобразить треугольник с помощью openGL на iOS. У меня есть настройка среды. Я могу изменить цвет фона на экране. У меня есть базовый вершинный и фрагментарный шейдер, которые как скомпилированы, так и связаны с программой успешно. glError() также не сообщает об ошибках.Базовый треугольный шейдер не отображается

По какой-то причине мой треугольник не является рендерингом.

установки я мой буфер кадра и сделать буфер, как это:

glGenRenderbuffers(1, &_colorRenderBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:drawable]; 

GLuint framebuffer; 
glGenFramebuffers(1, &framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
          GL_RENDERBUFFER, _colorRenderBuffer); 

Тогда я определяю 3 вершины моего треугольника:

_triangleMatrix[0] = -1.0; _triangleMatrix[1] = 0.0; 
_triangleMatrix[2] = 0.0; _triangleMatrix[3] = 1.0; 
_triangleMatrix[4] = 1.0; _triangleMatrix[5] = 0.0; 

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

[self createVertexShader]; 
[self createFragmentShader]; 
[self linkProgram]; 

Затем я использую программу и получить атрибут «положение» слот и позволяют ему:

glUseProgram(_program); 
_position_slot = glGetAttribLocation(_program, "position"); 
glEnableVertexAttribArray(_position_slot); 

Теперь мне нужно настроить VBO. Это та часть, о которой я не уверен.

glGenBuffers(1, &_vertex_buffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(_triangleMatrix), _triangleMatrix, GL_STATIC_DRAW); 

И тогда вот мой визуализации() метод:

glClear(GL_COLOR_BUFFER_BIT); 

    // 1rst attribute buffer : vertices 
    glVertexAttribPointer(
          _position_slot, 
          2,     // size 
          GL_FLOAT,   // type 
          GL_FALSE,   // normalized? 
          0,     // stride 
          (void*)0   // array buffer offset 
         ); 
    // Draw the triangle ! 
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle 
    glDisableVertexAttribArray(0); 
    [_context presentRenderbuffer:GL_RENDERBUFFER]; 

Вот код для скомпилированного вершинного шейдера:

NSString* vshader = \ 
@"attribute vec2 position; \ 
void main()\ 
{\ 
    gl_Position = vec4(position.x, position.y, 0.0, 1.0);\ 
}"; 

И пиксельный шейдер:

NSString* fshader = \ 
@"void main()\ 
{\ 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\ 
}"; 

Это в основном это, для всего файла вы можете проверить эту ссылку: https://gist.github.com/anonymous/6ed3f8231e76db35921ef260bfa6bf43

Я полагаю, что проблема заключается в том, что мой вершинный шейдер не получает данные «позиции» от моего члена _triangleMatrix. Таким образом, либо атрибут не настроен правильно, либо сами данные из _triangleMatrix не читаются openGL. В любом случае, из каждого учебника и руководства, которые я видел, я считаю, что правильно настроил его, и я в недоумении.

Кроме того, glError() не возвращает ошибки, и каждая процедура компиляции шейдеров или ссылка, которая может быть проверена на наличие ошибок, не сообщает об ошибках.

Любые идеи?

+0

Звонок glViewport() был тем, что мне нужно. По какой-то причине я забыл об этом и никогда не видел его в различных учебниках. Спасибо. – sugarmuff

ответ

1

Вам не хватает нескольких частей.

Самая важная вещь, которую вы пропустили, - установить окно просмотра: glViewport(x, y, width, height), вероятно, должен быть установлен в размере вашего буфера визуализации. Это определяет, какую часть буфера вы рисуете и должны быть установлены вручную.

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

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

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