Отсечение в форме круга с opengl-es в cocos2d - PullRequest
2 голосов
/ 02 августа 2011

Я пытаюсь сделать усечение в форме круга на CCSprite в cocos2d, после долгих поисков я попробовал метод open gl glississor, я добился квадратного отсечения по своему спрайту. Но мне нужно сделать его кругом, и кажется, что это невозможно сделать с glScissor. Я продолжал пробовать, и я нашел кое-что о GL трафарет, но я не нашел, как это сделать, и я не знаком с OpenGL.

Также я слышал, как несколько раз звонил glScissor, когда вы можете создать собственную фигуру, но я ничего не нашел.

Заранее спасибо, любой ответ приветствуется.

это мой фактический метод посещения:

-(void) visit
{
    glPushMatrix();
    glEnable(GL_SCISSOR_TEST);

    glScissor(clippingRegion.origin.x , clippingRegion.origin.y ,
            clippingRegion.size.width, clippingRegion.size.height);

    [super visit];

    glDisable(GL_SCISSOR_TEST);
    glPopMatrix();

}

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

glScissor не будет делать то, что вы хотите.Вот часть кода, который я написал некоторое время назад.Он рисует прямоугольник с решетчатой ​​текстурой и использует буфер трафарета для отображения только диска.

Вот ссылка, которую я использовал тогда:

0 голосов
/ 02 августа 2011

Вам, вероятно, потребуется создать цикл for, определить некоторые углы и смещения и выполнить вырезание Scissor по кругу вокруг спрайта, чтобы получить поле отсечения круглой формы. Но только если вы не можете создать круговую форму для начала - это будет намного быстрее в opengl-es.

Edit: Допустим, у вас есть квадрат 1x1 с центром в 0,0. Это будет означать, что координаты квадрата от (-.5, -. 5) до (.5, .5). Мы хотим превратить это в круг, используя отсечение. Один вызов gl scissor будет обрезать форму прямоугольника только с одной стороны, поэтому мы сделаем это с помощью цикла команд scissor. (Опять же, если вы можете просто создать многоугольник в форме круга, это будет быстрее).

Псевдокод для кругового вырезания:

polyX = 0;
polyY = 0;
polyWidth = 1;
rad = pi/180

for (int i = 0; i <360; i++)
{
    x = Math.cos(i*rad)*polyWidth + polyX;
    y = Math.sin(i*rad)*polyWidth + polyY;
    glScissor(x,y,((polyWidth/2)-polyX)-x,.05); 
}
...