ПредишенСледващото

Всичко, всичко, добър ден.
Имам една проста задача, която не може да бъде решен за почти една година (не мога да кажа, че съм горд от
Необходимо е да се направи кръг, така че центърът е светло, но близо до краищата на цвета постепенно променят към черно (Фигура 1)

Gradient в OpenGL

Фигура 1. кръг попълва с градиент монохромни

И всичко е добре, ако кръгът е със същия размер като на фигура 1, но веднага след като размерът се увеличава или намалява контраста между центъра и по краищата, а след това изплува много грозни неща.

Първо има концентрични кръгове (Фигура 2).

Gradient в OpenGL

Фигура 2. Показва концентрични кръгове

Второ, се получава този ефект, отколкото не се елиминира, нито нарастващи интервали цвят компонент или промяна на алфа канал.
На едни и същи ценности - същия ефект! печално

Мнозина смятат, че тя изглежда като образ на 8-битов. Тогава въпросът е как да се провери кои OpenGL режим избира да рисувате?

Предварителна резервация не шейдъри, текстури и други подобни, аз не използвате. Сега всичко е съставен, както следва:
1) кръга изготвен като набор от GL_TRIANGLE_FAN;
2) кръг център (връх А на триъгълник ABC) има цвят glColor4fv (HI_color) - светъл средата;
3) върховете В и С - точка на обиколката, имат цвят glColor4fv (LOW_color) - тъмно ръбове;
4) Градиент OpenGl се обръща, както в урок около 5.3 триъгълник със спектрален разлагане.

Въпросът, ми се струва, че Gëlle "не разбира" стойност на цвят е по-малко от 1 / (байт) 255 = (флоат) 0.0039

ВЪПРОС
Какво ограничения са цветови опции в модела RGBA (стотни, хилядни, TEN-хилядни (0.00. 000. 0000))? До каква степен е възможно да се разбият тези параметри, така че можете да видите разликата в цвета.
И как може да се получи около такива ограничения за оттегляне на цвета на екрана?

ЗА какво е всичко НУЖДА
Ние трябва да се промени или цвета или на прозрачността (Alpha), за да се постигне плавен фигура разтваряне във фонов цвят сцена, така че няма остри преходи са видими.

Подобно на публикацията? Запишете го да се върне към изучаването на материала!

Извинявам се, че липсва - някъде беше, а когато не си спомням

Код тази ситуация:
// OpenGL инициализация
анулира 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);
>

// Промяна на размера на сцената;
анулира ResizeGlScene ()
<
Gl.glViewport (0, 0, OpenGlControl.Width, OpenGlControl.Height);
Gl.glMatrixMode (Gl.GL_PROJECTION);
Gl.glLoadIdentity ();
Glu.gluPerspective (45.0f, (флоат) OpenGlControl.Width /
(Поплавък) OpenGlControl.Height, 0.1f, 100.0f);
Gl.glMatrixMode (Gl.GL_MODELVIEW);
Gl.glLoadIdentity ();
>

// Създаване на кръга в паметта;
частен невалидни GradienCircle (поплавък [] HI_color, поплавък [] LOW_color)
<
поплавък Rad = 0.3f; // Радиусът на кръга;
// брой точки по окръжност
// повече кръга гладко;
Int CV = 72;
// Array периферен координира точки;
поплавък [] VA = нов поплавък [CV * 2 + 2];
CreateCircle (рад, CV, VA); // Създаване на координатите на кръга;
ResizeBlurStep (1); // Reset списъците на дисплея;

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);
за (INT I = 2; и<
Gl.glVertex2f (Va, VA [Ь + 1]);
>
Gl.glVertex2f (Va [2], VA [3]);
Gl.glEnd ();
Gl.glEndList ();
Gl.glPopMatrix ();
>

// Draw сцената;
частен невалидни DrawGlScene ()
<
поплавък [] HiColor = <1, 1, 1, 1>;
поплавък [] 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);
// Otrisovuem списък дисплей;
Gl.glCallList (LIST_net);

Gl.glPopMatrix ();
Gl.glFlush ();
OpenGlControl.Invalidate ();
>

Ето изходния код и примерна програма.

И това е възможно по-подробно за спрайт и нейното изпълнение за конкретния случай?

Подкрепете проекта - споделете линка, благодаря!