Мне нужен OpenGL ES 1.1 для рендеринга объектов с текстурой, а другие - просто с использованием вершинных красок и цветов. - PullRequest
2 голосов
/ 14 октября 2011

Я работаю на XCode и использую OpenGL ES 1.1, и у меня есть два класса, один из которых текстурированный, а другой - просто треугольники с данными о цвете, и они хорошо отрисовываются, пока я не отрисовываю свои текстурированные треугольники, которые работают, но затем и другие тожестановятся текстурированными с нечетными частями моего атласа спрайтов, и у них вообще нет текстурных координат

-(void) renderWithUpdate {

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//Translate
glTranslatef(tranlation.x, tranlation.y, tranlation.z);

//Scale
glScalef(scale.x, scale.y, scale.z);

//Rotate
glRotatef( angleGeo, 1.0, 1.0, 0.0);


angleGeo = angleGeo + 0.5;
//NSLog(@"Rotation Angle:%F", (float)angleGeo );

glVertexPointer(vertexSize, GL_FLOAT, 0, self.vertexes );
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_FLOAT, 0, self.colors);
glEnableClientState(GL_COLOR_ARRAY);                


//Render with Texturing 
if (materialKey != nil) {

    [[MaterialController  sharedMaterialController] bindMaterial:materialKey];

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);

}


//Render
glDrawArrays( renderStyle, 0, self.vertexCount);
}

, и если я отключаю текстурные массивы в их методе рендеринга, они полностью исчезают, пока мои текстурированные объекты работают нормально

это как-то связано с glEnable(GL_TEXTURE_2D)?

1 Ответ

0 голосов
/ 14 октября 2011

После рендеринга текстурированных объектов вы должны отключить текстурирование, вызвав glDisable(GL_TEXTURE_2D) (я думаю, ваши bindMaterial *1003* методы вызывают glEnable(GL_TEXTURE_2D)). Недостаточно просто отключить массив координат текстуры (с glDisableClientState(GL_TEXTURE_COORD_ARRAY)) (хотя вы должны сделать это и после рендеринга текстурированной геометрии):

...
glDrawArrays( renderStyle, 0, self.vertexCount);

if(materialKey != nil)
{
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
}

Всегда имейте в виду, что OpenGL - это конечный автомат , и каждое изменяемое вами состояние (например, включение текстурирования) сохраняет свое значение до тех пор, пока вы не изменит его снова. Поэтому вы всегда должны знать, какие части вашего приложения изменяют состояние OpenGL (например, метод bindMaterial), и устанавливать каждое необходимое состояние непосредственно перед рендерингом.

...