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.