2010-10-01 3 views
0

То, что я хочу добиться:2D-графики на iPhone

  • чертежной PNG файлов с альфа точно так, как оно первоначально, без преобразования любого пикселя. Это связано с тем, что изображение очень детализировано, и я не хочу потерять часть информации.
  • Анимация этих изображений путем их вращения и перемещения. Нет масштабирования.

На самом деле я не хочу использовать сторонние библиотеки, такие как cocos2d. Я читал блоги об OpenGL ES, также проверял Texture2D.m, поэтому у меня есть основная идея о рисовании примитивов в 3D-пространстве. Насколько я понимаю, нужно ли рисовать и анимировать изображение (спрайт?), Я могу просто создать прямоугольник и текстуру карты. Но проблема в том, что я хочу, чтобы мой png-файл выглядел как оригинальный, не масштабированный или не вращающийся.

Какова наилучшая техника для достижения упомянутых выше точек? Рисование текстурированного прямоугольника в ортогональном окне просмотра? Как сохранить исходный размер/цвет изображения?

Извините, если вопрос немного испорчен, я могу уточнить.

ответ

1

По вашему описанию я не понимаю, почему вы используете OpenGL ES. Использование кварца и слоев позволит 1) рисовать PNG 2) вращать и перемещать их (даже масштабирование, если вы пожелаете). Было бы проще создать ортогональную проекцию в OpenGL +, обрабатывая загрузку изображений.

Теперь, если вы действительно хотите открыть OpenGL, да, вы должны настроить ортогональную проекцию, размер изображения которой строго равен размеру экрана, и нарисуйте прямоугольник точного размера, с текстурой, отображаемой с точным 0/1 координаты. Для цветового аспекта вы можете использовать формат 8888, который является точным, без сжатия, без уменьшения цвета и с полной альфой.

+0

Поэтому я хочу использовать OpenGL, что позже я могу добавить некоторые частицы или другие эффекты от OpenGL. Я не уверен, насколько хорошо Quartz2D можно смешивать с OpenGL или это хорошая практика. – Pablo

+0

Мне сказали, что смешивание Quartz2D и OpenGL не является хорошей практикой. При этом я успешно сделал это в нескольких приложениях. –

+0

Должен ли я использовать огни? – Pablo

1

Я знаю, что вы сказали, что не хотите использовать стороннюю библиотеку, но Cocos2D реализует 2D-графику с OpenGL, поэтому вы можете ссылаться на CCSprite.m, чтобы посмотреть, как они это сделали. Тем не менее, вы можете подумать, подходит ли эта библиотека для вашего приложения. Чтобы сделать свой собственный 3D-рендеринг, вам нужно только расширить CCSprite и добавить свой собственный код, как вы можете видеть в комментарии ниже, состояние уже настроено для вас и всего.

CCSprite.m:

-(void) draw 
{ 
    NSAssert(!usesBatchNode_, @"If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called"); 

    // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY 
    // Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY 
    // Unneeded states: - 

    BOOL newBlend = NO; 
    if(blendFunc_.src != CC_BLEND_SRC || blendFunc_.dst != CC_BLEND_DST) { 
     newBlend = YES; 
     glBlendFunc(blendFunc_.src, blendFunc_.dst); 
    } 

#define kQuadSize sizeof(quad_.bl) 
    glBindTexture(GL_TEXTURE_2D, [texture_ name]); 

    long offset = (long)&quad_; 

    // vertex 
    NSInteger diff = offsetof(ccV3F_C4B_T2F, vertices); 
    glVertexPointer(3, GL_FLOAT, kQuadSize, (void*) (offset + diff)); 

    // color 
    diff = offsetof(ccV3F_C4B_T2F, colors); 
    glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff)); 

    // tex coords 
    diff = offsetof(ccV3F_C4B_T2F, texCoords); 
    glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff)); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    if(newBlend) 
     glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST); 

#if CC_SPRITE_DEBUG_DRAW 
    CGSize s = [self contentSize]; 
    CGPoint vertices[4]={ 
     ccp(0,0),ccp(s.width,0), 
     ccp(s.width,s.height),ccp(0,s.height), 
    }; 
    ccDrawPoly(vertices, 4, YES); 
#endif // CC_TEXTURENODE_DEBUG_DRAW 

} 
Смежные вопросы