Gradiens opengl
Mindenkinek, jó délután.
Van egy egyszerű feladatom, amely nem merészel majdnem egy évet (nem mondhatom, hogy büszke vagyok rá
A CIRCLE-t úgy kell megrajzolni, hogy a központ könnyű legyen, és közelebb a szélekhez a szín simán változik a fekete színig (1. ábra)
1. ábra Monokróm gradienssel töltött kör
És minden rendben van, ha a kör ugyanolyan méretű, mint az 1. ábrán, de amint a méret nő, vagy a kontraszt a középpont és az élek között csökken, a legszörnyűbb dolgok jönnek ki.
Először koncentrikus körök jelennek meg (2.
2. ábra: A koncentrikus körök megnyilvánulása
Másodszor, ezt a hatást sem lehet kiküszöbölni: a színösszetevõ intervallumainak növelésével vagy az alfa-csatorna megváltoztatásával.
Ugyanazokkal az értékekkel - azonos hatással! sajnos
Sokan azt gondolják, hogy ez olyan, mint egy 8 bites kép. Akkor a kérdés: hogyan ellenőrizhetem, hogy mely OpenGL módot választom?
Előre foglalok minden árnyékolót, textúrát és így tovább, amit nem használok. Most mindent így vonzunk:
1) A kört a GL_TRIANGLE_FAN-ból álló sorozathoz húzzuk;
2) A kör középpontja (az ABC háromszög csúcsa A) a glColor4fv (HI_color) - a könnyű közép;
3) B és C csúcspontok a körön, rendelkezzen a glColor4fv (LOW_color) - sötét élek színével;
4) Az OpenGl gradiens a spektrális bomlással rendelkező háromszögre vonatkozóan 5.3.
Úgy tűnik számomra, hogy Jel "nem érti" a kevesebb mint 1 / (byte) 255 = (úszó) 0.0039 színt
KÉRDÉS
Mekkora az RGBA-modell színparamétereinek határa (száz, ezred, tizedik ezer (0000. 0000))? Mennyire oszthatja ezeket a paramétereket úgy, hogy a színkülönbség látható legyen.
És hogyan lehet megkerülni az ilyen korlátozásokat a színes kimeneten a képernyőn?
MIÉRT NE KELL SZÜKSÉG
Szükséges a szín vagy az átlátszóság (alfa-csatorna) megváltoztatását, hogy az ábrán a háttér háttérszínén egyenes feloldódjon, így a világos átmenetek nem láthatók.
Tetszik a kiadvány? Mentse el, hogy visszajusson az anyag tanulásához!
Kérelem egy petíciót, hogy nincs jelen - valahol ott voltam, és ahol nem emlékszem
A kóddal ez a helyzet:
// Az OpenGL inicializálása
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);
>
// Módosítsa a jelenet méretét;
void ResizeGlScene ()
<
Gl.glViewport (0, 0, OpenGlControl.Width, OpenGlControl.Height);
Gl.glMatrixMode (Gl.GL_PROJECTION);
Gl.glLoadIdentity ();
Glu.gluPerspective (45.0f, (float) OpenGlControl.Width /
(úszó) OpenGlControl.Height, 0.1f, 100.0f);
Gl.glMatrixMode (Gl.GL_MODELVIEW);
Gl.glLoadIdentity ();
>
// Hozzon létre egy kört a memóriában;
privát érvénytelen GradienCircle (float [] HI_color, float [] LOW_color)
<
float rad = 0,3 f; // A kör sugara;
// A körök pontjai száma
// annál inkább, annál könnyebb a kör;
int cv = 72;
// Körkörös pontok koordinátái;
float [] va = új úszó [cv * 2 + 2];
CreateCircle (rad, cv, va); // Készítsük el a kör koordinátáit;
ResizeBlurStep (1); // Nullázza a kijelző listáját;
Gl.glPushMatrix ();
Gl.glNewList (LIST_net, Gl.GL_COMPILE);
Gl.glBegin (Gl.GL_TRIANGLE_FAN);
// HIBA A SZÍNEK KIJELZÉSÉBEN Itt
// A kör közepét megvilágították;
Gl.glColor4fv (HI_color);
Gl.glVertex2f (va [0], va [1]);
// A kör maradék pontja sötét;
Gl.glColor4fv (LOW_color);
az (int i = 2; i
Gl.glVertex2f (va, va [i + 1]);
>
Gl.glVertex2f (va [2], va [3]);
Gl.glEnd ();
Gl.glEndList ();
Gl.glPopMatrix ();
>
// Vigye a jelenetet;
privát void DrawGlScene ()
<
úszó [] HiColor = <1, 1, 1, 1>;
úszó [] LowColor = <0, 0, 0, 1>;
HiColor [3] = LowColor [3] = CONTRAST_ALPHA / 100;
// A rajz elkezdésével kezdjük el a rajzot;
// A jelenet hátterének színe szürke;
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 ();
// Hozz létre egy gradienssel töltött kört a memóriában;
GradienCircle (HiColor, LowColor);
// Rajzolja meg a megjelenítési listát;
Gl.glCallList (LIST_net);
Gl.glPopMatrix ();
Gl.glFlush ();
OpenGlControl.Invalidate ();
>
Itt van a forráskód és a mintaprogram.
És részletesebben is olvashatsz a sprite-ről és annak végrehajtásáról egy konkrét esetre vonatkozóan?