Pracuję nad aplikacją pisma ręcznego na iOS. Znalazłem przykładowy projekt "GLPaint" z dokumentacji iOS, który jest implementowany przez OpenGL ES, i zrobiłem coś na nim modyfikacji.Jak uniknąć nakładania się przezroczystości za pomocą OpenGL?
Śledzę punkty dotykowe i obliczam krzywe między punktami i rysuję same obrazy cząsteczek na krzywej, aby wyglądała na miejsce przejścia palca.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData); // burshData is from CGImage, it is
// vertexBuffer is generated based on the calculated points, it's just a sequence of point where need to draw image.
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
glDrawArrays(GL_POINTS, 0, vertexCount);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
Co mam, to solidna linia, która wygląda całkiem nieźle. Ale teraz chcę narysować półprzezroczyste podświetlenie zamiast linii ciągłej. Dlatego zamieniam obraz cząstki na 50% przezroczystości bez zmiany kodu.
Result of 50% transparency particle image
Jest coś złego w mieszance.
narysować trzech punktów przy użyciu cząstek obraz pół przejrzystości, a obszar przecięcia należy utrzymać 50% przezroczystość.
Jakie jest rozwiązanie?
Problem polega na tym, że trzeba wyeliminować overdraw, które _ na ogólny przypadek_ nie jest możliwe przy "just blending". Możesz użyć bufora głębi (z testem alfa), ale to nie będzie prawidłowo antialias. Jeśli chcesz, aby to było właściwie antyaliasingowane, to nie jest banalne, aby uzyskać prawo, a przynajmniej nie w ogólnym przypadku. Będziesz musiał najpierw renderować do dodatkowego bufora ramki, a composite w drugim przebiegu. – Damon
Dziękuję za odpowiedź. Jestem początkującym do OpenGL, nadal nie jestem jasne o najbardziej koncepcji w OpenGL. Myślę, że antialias nie jest problemem. Czy mógłbyś podać kod z większą ilością szczegółów? –