Gradient în opengl

La toate, bună după-amiază.
Am o sarcină simplă, care nu îndrăznește aproape un an (nu pot spune că sunt mândru de asta
Este necesar să se deseneze un CIRCUL, astfel încât centrul să fie luminos și mai aproape de marginile culorii să se schimbe ușor până la negru (Fig.1)






Gradient în opengl

Fig.1 Cerc plin cu un gradient monocrom

Și totul este bine, dacă cercul este aceeași dimensiune ca și în figura 1, dar imediat ce crește dimensiunea sau scade contrastul dintre centru și marginile, apoi înota lucruri foarte urâte.

În primul rând, apar cercuri concentrice (figura 2).

Gradient în opengl

Figura 2. Expunerea cercurilor concentrice

În al doilea rând, acest efect nu poate fi eliminat: prin creșterea intervalelor componentei de culoare sau prin schimbarea canalului alfa.
Cu aceleași valori - același efect! trist

Mulți vor crede că este vorba de o imagine pe 8 biți. Apoi, întrebarea este, cum pot verifica ce mod OpenGL am ales să desenez?

Înainte de a face o rezervă de orice shaders, texturi și așa mai departe eu nu folosesc. Acum, totul este desenat astfel:
1) Cercul este desenat ca un set de la GL_TRIANGLE_FAN;
2) Centrul cercului (vârful A al triunghiului ABC) are culoarea glColor4fv (HI_color) - mijlocul luminii;
3) vârfurile B și C - punctele de pe cerc, au culoarea glColor4fv (LOW_color) - marginile întunecate;
4) Gradientul OpenGl se atrage, ca în Lecția 5.3, despre un triunghi cu descompunere spectrală.

Mi se pare că Jel "nu înțelege" culoarea mai mică de 1 / (octet) 255 = (float) 0.0039

ÎNTREBARE
Care este limita parametrilor de culoare din modelul RGBA (sute, mii, zece mii (.00, 000. 0000))? În ce măsură puteți împărți acești parametri astfel încât diferența de culoare să fie vizibilă.
Și cum puteți eluda astfel de limitări privind culoarea pe ecran?







PENTRU CE ESTE TOATE NECESITĂȚILE
Este necesar să se schimbe culoarea sau transparența (canalul alfa) pentru a obține o dizolvare netedă a figurii în culoarea de fundal a scenei, astfel încât tranzițiile clare să nu fie vizibile.

Îți place publicația? Salvați-l pentru a reveni la învățarea materialului!

Îți cer o petiție pe care am fost absentă - eram undeva și unde nu-mi amintesc

Cu codul această situație:
// Initializeaza OpenGL
void InitGl ()
<
Glut.gnitIdisplayMode (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);
>

// Schimbați dimensiunea scenei;
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 ();
>

// Creați un cerc în memorie;
privat void GradienCircle (float [] HI_color, float [] LOW_color)
<
float rad = 0.3f; // Radiusul cercului;
// Numărul de puncte din cerc
// mai mult, bricheta cercul;
int cv = 72;
// Array de coordonate ale punctelor unui cerc;
float [] va = float nou [cv * 2 + 2];
CreateCircle (rad, cv, va); // Creați coordonatele cercului;
ResizeBlurStep (1); // Zero liste de afișare;

Gl.glPushMatrix ();
Gl.glNewList (LIST_net, Gl.GL_COMPILE);

Gl.glBegin (Gl.GL_TRIANGLE_FAN);
// ERROR IN DISPLAY OF CULORI AICI
// Centrul cercului este desenat ușor;
Gl.glColor4fv (HI_color);
Gl.glVertex2f (va [0], va [1]);
// Punctele rămase din cerc sunt întunecate;
Gl.glColor4fv (LOW_color);
pentru (int i = 2; i<
Gl.glVertex2f (va, va [i + 1]);
>
Gl.glVertex2f (va [2], va [3]);
Gl.glEnd ();
Gl.glEndList ();
Gl.glPopMatrix ();
>

// Desenați scena;
private void DrawGlScene ()
<
flotare [] HiColor = <1, 1, 1, 1>;
float [] LowColor = <0, 0, 0, 1>;
HiColor [3] = LowColor [3] = CONTRAST_ALPHA / 100;
// Începeți desenul prin ștergerea ecranului;
Culoarea de fond a scenei este gri;
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 ();
// Creați un cerc plin de gradienți în memorie;
GradienCircle (HiColor, LowColor);
// Desenați lista de afișare;
Gl.glCallList (LIST_net);

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

Iată codul sursă și programul de probă.

Și puteți să detaliați despre sprite și implementarea acestuia pentru un anumit caz?







Trimiteți-le prietenilor: