2013-11-03 1 views
1

, который хочет перемещать объекты в сцене с матричным переводом, но не может заставить что-либо заклеить. Я могу заставить проекцию двигаться, но я не могу получить квадрат 2d для перемещения.iphone openGL ES 2 перевод объекта

Рендер код в классе спрайтов:

glGenBuffers(1, &self->_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_DYNAMIC_DRAW); 



glEnableVertexAttribArray(self.shader.positionSlot); 
glVertexAttribPointer(self.shader.positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 

glEnableVertexAttribArray(self.shader.colorSlot); 
glVertexAttribPointer(self.shader.colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)(sizeof(float) * 3)); 

GLuint indexBuffer; 
glGenBuffers(1, &indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

float matrix[16]; // trying to manipulate matrix here 
matrixSetIdentity(matrix); 

float translateMatrix[16]; 
matrixSetTranslation(translateMatrix, 0, 0, 0); 

float result[16]; 
matrixMultiply(matrix, translateMatrix, result); 
glUniformMatrix4fv(self.shader.positionSlot, 1, 0, result); //this doesn't work, the object disappears? 

glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices)/sizeof(Vertices[0])); 
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); 

Heres код шейдера:

attribute vec4 Position; 
attribute vec4 SourceColor; 

varying vec4 DestinationColor; 
uniform mat4 Projection; 
uniform mat4 Modelview; 


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

Теперь разочарование части является то, что это работает:

float h = 4.0f * self.frame.size.height/self.frame.size.width; 
float projection[16]; 
[self.matrix projection:projection Left:-2 Right:2 Top:h/2 Bottom:-h/2 near:4 far:20]; 
glUniformMatrix4fv(self.shader.projectionUniform, 1, 0, projection); 

float modelView[16]; 

matrixSetTranslation(modelView, 0.0, sin(CACurrentMediaTime()), -10.0); 
glUniformMatrix4fv(self.shader.modelViewUniform, 1, 0, modelView); 

glViewport(0, 0, self.frame.size.width, self.frame.size.height); 

не знаю, почему верхняя код, похоже, не работает, но нижний. Любые комментарии приветствуются.

+0

Очень сложно сказать, какая часть верхнего кода соответствует нижнему коду. –

+0

его общие функции для перевода и идентификации, только вершина находится в классе спрайтов, а нижняя часть - в классе сцены. Дайте мне знать, есть ли что-то, что вам нужно увидеть? – Matt

ответ

0

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

Это значение представляет собой преобразование 0 x, 0 y и 0 z единиц (при условии, что матрицаSetTranslation ведет себя как GLKMatrixMakeTranslation (https://developer.apple.com/library/ios/documentation/GLkit/Reference/GLKMatrix4/Reference/reference.html#//apple_ref/c/func/GLKMatrix4MakeTranslation)), которая является единичной матрицей, снова умноженной на единицу. Это дает вам единичную матрицу, эквивалентную умножению регулярного числа на единицу.

+0

, поскольку он сидит сейчас, к сожалению, он не отображается при использовании glUniformMatrix4fv. Его пусто, никаких ошибок, ничего. Я использовал 0,0,0, чтобы увидеть, будет ли он отображаться именно там, где он был. Может ли glUniformMatrix4fv противоречить атрибуту vec4 Position; попробовал изменить атрибут на единицу и не отображать снова. – Matt

+0

Это ... нет * впечатление, которое я получил из формулировки вашего вопроса. Вы сказали, что не можете заставить его двигаться », а не« Это совсем не похоже ». Правильно ли рисуются другие вещи? Вы подразумеваете, что это рисует, когда вы не даете ему никаких данных для униформы? реальный вопрос - это то, что делает ваша функция matrixMultiply - возможно, у нее есть ошибка. Почему вы не используете GLKit для математической матрицы? –

+0

Также вам следует серьезно подумать о реорганизации вашего кода - если этот материал происходит в цикле рендеринга, это ужасно неэффективно. вызовы glDrawArrays и glDrawElements являются избыточными - если вам нужны индексы, используйте glDrawElements, если вы не используете glDrawArrays - не оба. Вы делаете новый VBO каждый цикл, и из-за внешнего вида те же данные в. Сделайте это один раз, когда вы инициализируете свой класс спрайтов и сделаете его GL_STATIC_DRAW. Вам нужно только один раз включить vertexAttribArray. Вы пытаетесь сделать что-то в 2D? Если это так, вам, вероятно, не нужна матрица проекции на все. –