Всім-всім, добрий день.
Є у мене одна проста задача, яка не вирішується майже рік (не можу сказати, що я цим пишаюся
Потрібно намалювати КРУГ так, щоб центр був світлим, а ближче до країв колір плавно змінювався аж до чорного (Рис.1)
Рис.1 Окружність залита монохромним градієнтом
І все добре якщо коло такого ж розміру як і на Рис.1, але як тільки розмір збільшується або ж зменшується контраст між центром і краями, то випливають самі некрасиві речі.
По-перше з'являються концентричні кола (Рис.2).
Рис.2 Прояв концентричних кіл
По-друге цей ефект ні чим не виходить усунути: ні збільшенням проміжків колірної складової, ні зміною альфа-каналу.
При тих же значеннях - той же ефект! сумно
Багато хто подумає що це схоже на 8 бітове зображення. Тоді питання, як перевірити який режим OpenGL вибирає для малювання?
Заздалегідь обмовлюся ніяких шейдеров, текстур і тому подібного я не використовую. Зараз все малюється так:
1) Коло малюється, як набір з GL_TRIANGLE_FAN;
2) Центр кола (вершина А трикутника АБЦ) має колір glColor4fv (HI_color) - світла середина;
3) Вершини Б і Ц - точки на колі, мають колір glColor4fv (LOW_color) - темні краю;
4) Градієнт OpenGl малює сам, як в Уроці 5.3 про трикутник зі спектральним розкладанням.
Справа, мені здається в тому, що Джелу "не розуміє" кольору менше значення 1 / (byte) 255 = (float) 0.0039
ПИТАННЯ
Який межа мають параметри кольору в моделі RGBA (соті, тисячні, десятитисячні (.00. 000. 0000),)? До якої міри можна дробити ці параметри, щоб була видна різниця в кольорі.
І як можна обійти подібні обмеження щодо виведення кольору на екран?
ДЛЯ ЧОГО ЦЕ ВСЕ ПОТРІБНО
Потрібно змінюючи або колір, або прозорість (альфа-канал) домогтися плавного розчинення фігури в кольорі фону сцени так, щоб чіткі переходи не були видні.
Сподобалася публікація? Збережіть її, щоб повернутися до вивчення матеріалу!
Прошу прохання, що був відсутній - десь був, а де не пам'ятаю
З кодом така ситуація:
// Ініціалізація OpenGL
void InitGl ()
<
Glut.glutInitDisplayMode (Glut.GLUT_RGBA |
Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE |
Glut.GLUT_ALPHA);
Gl.glEnable (Gl.GL_DEPTH_TEST);
Gl.glClearDepth (1.0f);
Gl.glDepthFunc (Gl.GL_LEQUAL);
Gl.glShadeModel (Gl.GL_SMOOTH);
Gl.glHint (Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);
Gl.glEnable (Gl.GL_BLEND);
Gl.glBlendFunc (Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
Gl.glEnable (Gl.GL_ALPHA_TEST);
>
// Зміна розмірів сцени;
void ResizeGlScene ()
<
Gl.glViewport (0, 0, OpenGlControl.Width, OpenGlControl.Height);
Gl.glMatrixMode (Gl.GL_PROJECTION);
Gl.glLoadIdentity ();
Glu.gluPerspective (45.0f, (float) OpenGlControl.Width /
(Float) OpenGlControl.Height, 0.1f, 100.0f);
Gl.glMatrixMode (Gl.GL_MODELVIEW);
Gl.glLoadIdentity ();
>
// Створення кола в пам'яті;
private void GradienCircle (float [] HI_color, float [] LOW_color)
<
float rad = 0.3f; // Радіус кола;
// Кількість точок на окружності
// чим більше, тим коло плавніше;
int cv = 72;
// Масив координат точок кола;
float [] va = new float [cv * 2 + 2];
CreateCircle (rad, cv, va); // Створюємо координати кола;
ResizeBlurStep (1); // обнулити дисплейні списки;
Gl.glPushMatrix ();
Gl.glNewList (LIST_net, Gl.GL_COMPILE);
Gl.glBegin (Gl.GL_TRIANGLE_FAN);
// ПОМИЛКА В відображення квітів ТУТ
// Центр кола малюється світлим;
Gl.glColor4fv (HI_color);
Gl.glVertex2f (va [0], va [1]);
// Решта точки окружності темним;
Gl.glColor4fv (LOW_color);
for (int i = 2; i
Gl.glVertex2f (va, va [i + 1]);
>
Gl.glVertex2f (va [2], va [3]);
Gl.glEnd ();
Gl.glEndList ();
Gl.glPopMatrix ();
>
// Малювання сцени;
private void DrawGlScene ()
<
float [] HiColor = <1, 1, 1, 1>;
float [] LowColor = <0, 0, 0, 1>;
HiColor [3] = LowColor [3] = CONTRAST_ALPHA / 100;
// Починаємо малювання з очищення екрана;
// Колір фону сцени сірий;
Gl.glClearColor (0.5f, 0.5f, 0.5f, 1.0f);
Gl.glClear (Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity ();
Gl.glTranslatef (0, 0, -1);
Gl.glPushMatrix ();
// Створюємо градиентно зафарбовані коло в пам'яті;
GradienCircle (HiColor, LowColor);
// Отрісовуем список відображення;
Gl.glCallList (LIST_net);
Gl.glPopMatrix ();
Gl.glFlush ();
OpenGlControl.Invalidate ();
>
Ось на вихідні і приклад програми.
А можна по-докладніше про спрайт і його реалізацію для конкретного випадку?