Рисование простых линий в шейдерах OpenGL ES 2.0 на IOS - PullRequest
2 голосов
/ 28 ноября 2011

Я с трудом пытаюсь рисовать простые линии через шейдер OpenGL ES 2.0.Я пытаюсь использовать glDrawArrays с GL_LINES, но до сих пор у меня ничего не получалось.

Мой вершинный шейдер является самым базовым, что вы можете получить:

attribute vec4 Position; 
attribute vec4 SourceColor; 

uniform mat4 Projection;
uniform mat4 ModelView;

varying vec4 DestinationColor; 

void main(void) { 
    DestinationColor = SourceColor; 
    gl_Position = Projection * ModelView * Position;
}

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

varying lowp vec4 DestinationColor;

void main(void) {
    gl_FragColor = DestinationColor;
}

У меня есть некоторые сомнения:

  1. Как настроить координаты точек отправления и пункта назначения?
  2. Как настроить проекцию и представление моделиматрицы в этом случае?С квадратом матрица ModelView будет содержать свою центральную координату, но что происходит в случае Линии?

У кого-нибудь есть пример?

РЕДАКТИРОВАТЬ:

Хорошо, у меня есть следующий код:

    glLineVertices[0].Position[0] = origin.x;
    glLineVertices[0].Position[1] = origin.y;
    glLineVertices[0].Position[2] = 0;
    glLineVertices[0].Color[0] = 1.0f;
    glLineVertices[0].Color[1] = 0.0f;
    glLineVertices[0].Color[2] = 0.0f;
    glLineVertices[0].Color[3] = 0.0f;
    glLineVertices[0].Normal[0] = 0.0f;
    glLineVertices[0].Normal[1] = 0.0f;
    glLineVertices[0].Normal[2] = 1.0f;

    glLineVertices[1].Position[0] = end.x;
    glLineVertices[1].Position[1] = end.y;
    glLineVertices[1].Position[2] = 0;
    glLineVertices[1].Color[0] = 1.0f;
    glLineVertices[1].Color[1] = 0.0f;
    glLineVertices[1].Color[2] = 0.0f;
    glLineVertices[1].Color[3] = 0.0f;
    glLineVertices[1].Normal[0] = 0.0f;
    glLineVertices[1].Normal[1] = 0.0f;
    glLineVertices[1].Normal[2] = 1.0f;

    glGenVertexArraysOES(1, &vertexArray);
    glBindVertexArrayOES(vertexArray);

    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, vertexStructureSize, glLineVertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(shaderManager.currentAttributeVertexPosition);
    glVertexAttribPointer(shaderManager.currentAttributeVertexPosition, 3, GL_FLOAT, GL_FALSE, sizeof(glLineVertex), 0);
    glEnableVertexAttribArray(shaderManager.currentAttributeSourceColor);
    glVertexAttribPointer(shaderManager.currentAttributeSourceColor, 4, GL_FLOAT, GL_FALSE,  sizeof(glLineVertex), (char *)12);
    glEnableVertexAttribArray(shaderManager.currentAttributeVertexNormal);
    glVertexAttribPointer(shaderManager.currentAttributeVertexNormal, 3, GL_FLOAT, GL_FALSE, sizeof(glLineVertex), (char *)28);

С методом рендеринга:

- (void)render
{
    //It might as well be the Identity Matrix, nothing happens either way.
    //modelViewMatrix = GLKMatrix4Identity;   
    modelViewMatrix = GLKMatrix4MakeTranslation(0, 0, 0.0f);    
    glUniformMatrix4fv(shaderManager.currentUniformModelViewMatrix, 1, 0, modelViewMatrix.m);

    glBindVertexArrayOES(vertexArray);
    glDrawArrays(GL_LINES, 0, size);  

}

И с этой проекционной матрицей:

_projectionMatrix = GLKMatrix4MakeOrtho(0, self.view.bounds.size.width, 0, self.view.bounds.size.height, -1.0f, 1.0f);

[shaderManager useShaderProgram:@"LineShader"];

glUniformMatrix4fv([shaderManager getUniform:@"Projection" ofShader:@"LineShader"], 1, 0, _projectionMatrix.m);

Как только я использую:

[lineDraw render];

Ничего не происходит.Кто-нибудь знает почему?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Я наконец понял это.

Эти простые строки:

glEnableVertexAttribArray(shaderManager.currentAttributeVertexNormal);
glVertexAttribPointer(shaderManager.currentAttributeVertexNormal, 3, GL_FLOAT, GL_FALSE, sizeof(glLineVertex), (char *)28);

вызывали проблему, потому что я временно отключил использование нормалей в шейдере, закомментировав соответствующий атрибут. Не знал, что просто делая это, ничья не произойдет, и ни getError () не выдаст ошибку.

Я буду считать приведенный выше ответ правильным, поскольку он помог мне уточнить вычисления координат и соответствующих матриц. В этом примере, простые двухмерные линии, не требуется никакой специальной моделиViewMatrix, она может оставаться как "GLKMatrix4Identity".

Еще раз спасибо:)

0 голосов
/ 28 ноября 2011
  1. «Исходные и конечные точки», если вы подразумеваете две конечные точки линии, являются просто вершинами линий, в вашем случае значения, отправленные в атрибут Position.Таким образом, при использовании glDrawArrays массив вершин / VBO, связанный с атрибутом Position (используя glVertexAttribPointer с соответствующим индексом атрибута), содержит (или должен содержать) начальную и конечную точки всех строк, хранящихся одна за другой.,И массив, связанный с атрибутом SourceColor, конечно, должен содержать цвета этих вершин соответственно.

  2. Матрица Projection настроена как всегда, она содержит преобразование проекции иобычно это либо ортографическая проекция (например, для параллельного 2D-вида), либо перспективная проекция (для «реального» вида с более удаленными объектами, кажущимися меньшими). ​​

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

    Таким образом, для квадрата не нужно просто содержать центр квадратуры, это просто зависит от того, как вы хотите преобразовать его и какие значения имеют его нетрансформированные вершины (те, которые вы отправляетеоткрытьGL через атрибут Position).Просто имейте в виду, что необработанные вершины, которые вы отправляете в атрибут Position, находятся в локальном пространстве набора строк и затем преобразуются в мировое пространство (и далее в пространство просмотра) с помощью матрицы ModelView.

    Таким образом, если ваша линия имеет вершины (0,0) и (1,1), точка поворота линии (начало ее локальной системы координат) находится в начальной точке, тогда как линия из (-1,0)к (1,0) имеет локальное происхождение в центральной точке.Это зависит только от реальных вершин ваших линий.

Но, конечно, если все это звучит очень чуждо вам, вам следует немного углубиться в основы OpenGL и компьютерной графики.в общем.

...