Я пытаюсь отобразить треугольник с помощью 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() не возвращает ошибки, и каждая процедура компиляции шейдеров или ссылка, которая может быть проверена на наличие ошибок, не сообщает об ошибках.
Любые идеи?
Звонок glViewport() был тем, что мне нужно. По какой-то причине я забыл об этом и никогда не видел его в различных учебниках. Спасибо. – sugarmuff