Я с трудом пытаюсь рисовать простые линии через шейдер 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;
}
У меня есть некоторые сомнения:
- Как настроить координаты точек отправления и пункта назначения?
- Как настроить проекцию и представление моделиматрицы в этом случае?С квадратом матрица 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];
Ничего не происходит.Кто-нибудь знает почему?