Я пытаюсь провести две параллельные линии. Я могу нарисовать одну строку, но когда я иду, чтобы нарисовать вторую строчку, то никто не рисует. Не знаю, почему.Рисовать сетку в OpenGL ES 2.0
У меня есть класс Line, который выглядит следующим образом:
#import "Line.h"
static GLKBaseEffect *effect;
@implementation Line
typedef struct {
GLKVector3 positionCoordinates;
GLKVector4 colorCoordinates;
} VertexData;
VertexData unitLine[] = {
//{ { position x, position y, position z}, {red, blue, green, alpha} }
{ { -0.5f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ { 0.5f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f} }
};
- (id) initWithEffect:(GLKBaseEffect *) effect {
if (self = [super init]) {
self.effect = effect;
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(unitLine), unitLine, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLubyte *)0 + offsetof(VertexData, positionCoordinates));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLubyte *)0 + offsetof(VertexData, normalCoordinates));
glBindVertexArrayOES(0);
}
return self;
}
- (GLuint) getVertexArray
{
return _vertexArray;
}
- (void) render {
glClear(GL_COLOR_BUFFER_BIT);
[self.effect prepareToDraw];
glDrawArrays(GL_LINES, 0, 2);
}
- (void) update {
}
- (void) tearDown
{
glDeleteBuffers(1, &_vertexBuffer);
glDeleteVertexArraysOES(1, &_vertexArray);
}
@end
Тогда, в GLKview, я пытаюсь сделать эти две линии, как это:
В ViewController.m, у меня есть это:
@interface ViewController() {
GLuint _program, _program1;
GLint i;
GLfloat j;
GLKMatrix4 _modelViewProjectionMatrix;
GLfloat _model_translate_x;
GLfloat _model_translate_y;
GLfloat _model_translate_z;
Cube *my_cube;
Line *my_line[20]; // for the grid lines
}
- (void)viewDidLoad
{
...
for (i=0; i<20; i++) {
my_line[i] = [[Line alloc] initWithEffect: self.effect];
}
...
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
...
modelViewMatrix = GLKMatrix4MakeTranslation(_model_translate_x, _model_translate_y, _model_translate_z);
modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, 10.0, 1.0, 1.0);
glBindVertexArrayOES([my_line[0] getVertexArray]);
modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, 0.0f, 0.0f, 0.0f);
[my_line[0] render];
modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.5f, 0.0f);
[my_line[1] render];
}
Если я прокомментирую последнюю строку, то получаю одну строку. Если я оставлю это, у меня не будет линий. В любом случае, я также получаю сообщение об ошибке консоли 0x0502. Что я делаю не так? Благодаря!
ОБНОВЛЕНИЕ: У меня есть другие объекты, которые были сделаны до этого кода. До сих пор эти объекты правильно рисовались. Кажется, что как только [my_line[0] render]
выполняет, все остальные объекты исчезают. Что мне делать, чтобы исправить это?
Является ли 'modelViewMatrix 'локальной или переменной экземпляра? Если вы ничего не делаете с свойством 'transform' вашего экземпляра' GLKBaseEffect' (и вызывая его метод 'prepareToDraw' после каждого изменения и перед рисованием), вы не увидите никаких изменений. – rickster
'modelViewMatrix' является локальной переменной. Я добавил больше кода на свой пост, чтобы вы могли видеть больше того, что я делаю. Может быть, я инициализирую свой массив объектов «Line» неправильно? – Alex
Спасибо за совет. Что мне нужно сделать для свойства 'transform' и где я должен называть' prepareToDraw'. Как вы можете сказать, я новичок в этом материале ES 2.0, так что это то, с чем я борюсь. Благодаря! – Alex