Oliskohan jossain selkee ja kattava selostus openGL:n normaalien käyttöön valaistuksessa?
Kun en saa tätä toimimaan oikeen mitenkää.
Tuossa koodia jos joku viittii ihmetellä mikä menee vikaan.
static const float vertex_map[8][3] =
{
// x, y, z
0.0, 0.0, 0.0,
0.0, 0.0, 1.0,
1.0, 0.0, 1.0,
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 1.0, 1.0,
1.0, 1.0, 1.0,
1.0, 1.0, 0.0
};
static const unsigned __int8 slope_map[13][4] =
{
0, 1, 3, 2, //flat
0, 5, 3, 6, //z+ uphill
1, 6, 0, 7, //x+ uphill
2, 7, 1, 4, //z- uphill
3, 4, 2, 5, //x- uphill
6, 3, 1, 0, //x+ z+ outer corner
5, 2, 0, 3, //x- z+ outer corner
4, 1, 3, 2, //x- z- outer corner
7, 0, 2, 1, //x+ z- outer corner
6, 7, 5, 0, //x+ z+ inner corner
5, 6, 4, 3, //x- z+ inner corner
4, 5, 7, 2, //x- z- inner corner
7, 4, 6, 1 //x+ z- inner corner
};
static const float normal_map[13*2][3] =
{
// x, y, z
//flat
0.0, 1.0, 0.0,
0.0, 1.0, 0.0,
//z+ uphill
0, 0.7, -0.7,
0, 0.7, -0.7,
//x+ uphill
-0.7, 0.7, 0,
-0.7, 0.7, 0,
//z- uphill
0, 0.7, 0.7,
0, 0.7, 0.7,
//x- uphill
0.7, 0.7, 0,
0.7, 0.7, 0,
//x+ z+ outer corner
//-0.58, 0.58, -0.58,
-0.58, 0.58, -0.58,
0.0, 1.0, 0.0,
//x- z+ outer corner
0.58, 0.58, -0.58,
0.0, 1.0, 0.0,
//x- z- outer corner
0.58, 0.58, 0.58,
0.0, 1.0, 0.0,
//x+ z- outer corner
-0.58, 0.58, 0.58,
0.0, 1.0, 0.0,
//x+ z+ inner corner
0.0, 1.0, 0.0,
-0.58, 0.58, -0.58,
//x- z+ inner corner
0.0, 1.0, 0.0,
0.58, 0.58, -0.58,
//x- z- inner corner
0.0, 1.0, 0.0,
0.58, 0.58, 0.58,
//x+ z- inner corner
0.0, 1.0, 0.0,
-0.58, 0.58, 0.58
};
bool application::drawTile(int n)
{
if(n >= map_x*map_z)
return false;
float
z = ((float)(n/map_x))*map_scale_z,
x = ((float)(n-(map_x*(n/map_x))))*map_scale_x,
y = ((float)map[n].depth)*map_scale_y;
if(map[n].slope >= 0 && map[n].slope < 13)
{
if(n == selected_tile)
glColor3f(0.8f,0.8f,0.0f);
else
glColor3f(0.5f, 1.0f,0.5f);
glBegin(GL_TRIANGLES);
glNormal3f(normal_map[map[n].slope*2][0],normal_map[map[n].slope*2][2],normal_map[map[n].slope*2][3]);
glVertex3f(calc_x(0), calc_y(0), calc_z(0));
glVertex3f(calc_x(1), calc_y(1), calc_z(1));
glVertex3f(calc_x(2), calc_y(2), calc_z(2));
glEnd();
glBegin(GL_TRIANGLES);
glNormal3f(normal_map[map[n].slope*2+1][0],normal_map[map[n].slope*2+1][2],normal_map[map[n].slope*2+1][3]);
glVertex3f(calc_x(2), calc_y(2), calc_z(2));
glVertex3f(calc_x(1), calc_y(1), calc_z(1));
glVertex3f(calc_x(3), calc_y(3), calc_z(3));
glEnd();
//draw normals for debug
if(n == selected_tile)
{
glColor3f(1.0f,1.0f,1.0f);
int nm[6] = { 0, 1, 2, 2, 1, 3 };
for(int i = 0; i < 2; i++)
{
for(int ii = 0; ii < 3; ii++)
{
int in = i*3 + ii;
glBegin(GL_LINES);
glVertex3f(calc_x(nm[in]), calc_y(nm[in]), calc_z(nm[in]));
glVertex3f(calc_x(nm[in])+normal_map[map[n].slope*2+i][0], calc_y(nm[in])+normal_map[map[n].slope*2+i][1], calc_z(nm[in])+normal_map[map[n].slope*2+i][2]);
glEnd();
}
}
}
//debug code ends
}
return true;
}Virhelistan voisit postata.
Ja mistä päin sen valon pitäisi tulla? Et ole lainkaan käyttänyt OpenGL:n valotoimintoja. Eivät ne valot itsestään ilmesty oikeisiin paikkoihin.
OpenGL:n valaistus on hyvin rajoittunut mm. valojen määrän ja varjojen suhteen, joten tarkkaa lopputulosta varten täytyy tehdä laskut itse (tai käyttää valmista grafiikkamoottoria). Jonkin verran on mahdollista kikkailla asettamalla GL:n valoiksi esinettä lähimmät valot, mutta tälläkään ei pärjää loputtomiin.
Tuollaista tuottaa http://i45.tinypic.com/el5urr.png
Valot on määritelty toisaalla
//lights
glEnable(GL_LIGHTING);
GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat LightPosition[] = { 50.0f, 50.0f, 50.0f, 1.0f };
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glEnable(GL_LIGHT1);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ) ;
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LightSpecular);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, LightEmission);Jaa, selvä. Vilkaisin koodia tarkemmin, liittyisivätkö glNormal3f-riveillä olevat indeksit ([0], [2], [3]) asiaan jotenkin?
Voisit laittaa floatin tilalle GLfloat ja käyttää glNormal3fv:tä, niin välttäisit virheen. Lisäksi suosittelen käännösasetuksia -std=c++98 -Wall -pedantic -O2. Koodia selkeyttäisi, jos käyttäisit rakenteita pelkkien taulukoiden sijaan.
Jes, olipas taas typerä virhe.
Kiitos taas kerran.
Aihe on jo aika vanha, joten et voi enää vastata siihen.