- pokaż wreszcie jak to światło ustawiasz w kodzie, inaczej nie da się ci pomóc
Proszę bardzo - funkcja z ustawianiem parametrów sceny:
void setGLParams()
{
if( isLight() ) glEnable (GL_LIGHTING);
else glDisable(GL_LIGHTING);
if( isDepth() ) glEnable (GL_DEPTH_TEST);
else glDisable(GL_DEPTH_TEST);
// glClearDepth(1.0f);
// glDepthFunc(GL_LESS);
glShadeModel (isSmooth() ? GL_SMOOTH : GL_FLAT);
if( isLineSmooth() ) glEnable (GL_LINE_SMOOTH);
else glDisable(GL_LINE_SMOOTH);
float v[4]; v[0] = v[1] = v[2] = v[3] = 1;
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, v);
v[0] = TwoSide() ? 1 : 0;
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, v);
v[0] = LocalViewer() ? 1 : 0;
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, v);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
// glEnable(GL_COLOR_MATERIAL);
glClearColor(clearColor[0], clearColor[1], clearColor[2], 1);
for(int i = 0; i < MAX_LAMP; i++) // tu są parametry lamp
if( bLamp & (1 << i) )
{
setLamp(tLamp[i], i);
glEnable(GL_LIGHT0+i);
}
else glDisable(GL_LIGHT0+i);
if( isFog() )
{
glFogi (GL_FOG_MODE, fog.mode);
glFogfv(GL_FOG_COLOR, fog.color);
glFogf (GL_FOG_DENSITY, fog.density);
// if( mode == GL_LINEAR )
glFogf (GL_FOG_START, fog.start);
glFogf (GL_FOG_END, fog.end);
glEnable(GL_FOG);
}
else glDisable(GL_FOG);
}
ustawienie lamp wygląda tak:
void setLamp(float *p, uint ix) // p to tablicz 24 floatów - pozycja 4, kierunek 3, ambient 4, itd...
{
ix += GL_LIGHT0;
// glEnable(GL_LIGHT0+ix);
glLightfv(ix, GL_POSITION, p); p += 4; // = (0,0,1,0); w = 0 -> tylko kierunkowe
glLightfv(ix, GL_SPOT_DIRECTION, p); p += 3; // kierunek = (0, 0, -1)
glLightfv(ix, GL_AMBIENT, p); p += 4; // = (0,0,0,1) stałe
glLightfv(ix, GL_DIFFUSE, p); p += 4; // = (0,0,0,1); L0 =(1,1,1,1)
glLightfv(ix, GL_SPECULAR, p); p += 4; // - '' - odbite
glLightfv(ix, GL_SPOT_EXPONENT, p); p += 1; // 0-128 = 0
glLightfv(ix, GL_SPOT_CUTOFF, p); p += 1; // 0-90 lub 180 = 180
// rozpraszanie: 1/f = a + b*r + c*r^2;
glLightfv(ix, GL_CONSTANT_ATTENUATION, p); p += 1; // a > 0 = 1
glLightfv(ix, GL_LINEAR_ATTENUATION, p); p += 1; // b > 0 = 0
glLightfv(ix, GL_QUADRATIC_ATTENUATION, p); // c > 0 = 0
}
void posLamps(float *pt, uint b)
{
for(int ix = GL_LIGHT0; b; ix++, pt+=N_LAMP_F, b >>= 1)
if( b & 1 )
{
glLightfv(ix, GL_POSITION, pt);
glLightfv(ix, GL_SPOT_DIRECTION, pt+4);
}
}
- czarna część möbiusa jest po prostu w cieniu, a przy braku atmosfery masz efekt cienia księżycowego – czarnego. pod linkiem przeze mnie podanym masz informacje o różnych rodzajach oświetlenia; poczytaj zwłaszcza o ambient light.
Ambient light nie ma wpływu na cienie.
To jest tylko 'zerowe' oświetlenie otoczenia, czyli bias koloru - zawsze, bezwarunkowo dodawany do światła.