Я следовал этот учебник http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/, чтобы понять, как просмотр работает, но потом, когда я попытался применить это на мое приложение IOS у меня было так много проблемРисование куба в прошивкой с OpenGL и GLKit
так в основном то, что я понял, это что: (?, что является эквивалентом этого в прошивке)
- модель первоначально в нуле и поэтому камера
- затем мы используем GLM :: LookAt, чтобы переместить камеру в нужном положении
- Нанести преобразование проекции, чтобы перейти от пространства камеры до гомогенного единичного куба пространства
Из основного IOS урока я нашел следующий расчет проекционной матрицы
float aspect = fabs(self.view.bounds.size.width/self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
_modelViewProjectionMatrix = projectionMatrix;
, который я действительно не сделал понимаете ... как они придумали, например, 65?
Другой учебник сделал это:
glViewport(0, 0, self.view.bounds.size.width,self.view.bounds.size.height);
Реализация: мое текущее приложение отображает только синий экран (в основном цвет моего куба) , который я предполагаю, что это потому, что камера находится в начале координат
Я следующий набор данных
static const GLfloat cubeVertices[] = {
-1.0f,-1.0f,-1.0f, // triangle 1 : begin
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
1.0f, 1.0f,-1.0f, // triangle 2 : begin
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f, // triangle 2 : end
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
Это моя установка, очень простое из tutori IOS аль
- (void)setupGL {
[EAGLContext setCurrentContext:self.context];
[self loadShaders];
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), cubeVertices, GL_STATIC_DRAW);
glVertexAttribPointer (GLKVertexAttribPosition,
3,
GL_FLOAT, GL_FALSE,
0,
BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribPosition);
//glBindVertexArrayOES(0);
}
и мой drawInRect и обновлять методы
- (void)update {
//glViewport(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
float aspect = fabs(self.view.bounds.size.width/self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
_modelViewProjectionMatrix = projectionMatrix;
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glDrawArrays(GL_TRIANGLES, 0, 12*3);
}
и моя вершинный шейдер
attribute vec4 position;
uniform mat4 modelViewProjectionMatrix;
void main() {
gl_Position = modelViewProjectionMatrix * position;
}
и мой пиксельный шейдер
void main() {
gl_FragColor = vec4 (0.165, 0.427, 0.620, 1.0);
}
Очень полезное объяснение, чем вы так много! он соединял точки для меня, поскольку я читал фрагменты отсюда и там, не имея возможности подключить их. – nevermind
Да, эти системы могут быть очень неприятными, поскольку некоторые из них очень трудно понять. Вы можете найти сотни примеров, а не 2 из них, которые кажутся одинаковыми. Я рад, что мое объяснение помогло вам, но это довольно много, чтобы принять участие в не-эксперте в этой области.Я рад, что это помогло вам. –