OpenGL освещение с использованием вершинных массивов

Я просто пишу простую программу для рисования вокселей с использованием объекта массива вершин. Я не могу заставить освещение работать должным образом, когда я запускаю программу, она выглядит так же, как когда огни не включены. Вот фрагменты кода. функция отображения

void GraphicVoxel::display()
{
glColor3fv(&color[0]);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, &norms[0]);
glVertexPointer(3, GL_FLOAT, 0, &verts[0]);

glPushMatrix();

glTranslatef(x, y, -z);

glDrawArrays(GL_QUADS, 0, verts.size()/3);

glPopMatrix();

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}

инициализация opengl

void initGL(sf::Window & window)
{
gluPerspective(40., float(window.getSize().x)/
float(window.getSize().y), 1., 10000.);

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable( GL_COLOR_MATERIAL );

GLfloat lightKa[] = {.1f, .1f, .1f, 1.0f};
GLfloat lightKd[] = {1.f, 1.f, 1.f, 1.0f};
GLfloat lightKs[] = {0.5, 0.5, 0.5, 0.5};
glLightfv(GL_LIGHT0, GL_AMBIENT, lightKa);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightKd);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightKs);

float lightPos[4] = {100, 1, 0, 0};
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

glEnable(GL_LIGHT0);
}

и код для создания вершин и нормальных массивов

// create vertex array
verts.resize(72);
// left
verts[0] = -width/2.f; verts[1] = -height/2.f; verts[2] = -depth/2.f;
verts[3] = -width/2.f; verts[4] = -height/2.f; verts[5] =  depth/2.f;
verts[6] = -width/2.f; verts[7] =  height/2.f; verts[8] =  depth/2.f;
verts[9] = -width/2.f; verts[10]=  height/2.f; verts[11]= -depth/2.f;
// right
verts[12]=  width/2.f; verts[13]= -height/2.f; verts[14]= -depth/2.f;
verts[15]=  width/2.f; verts[16]= -height/2.f; verts[17]=  depth/2.f;
verts[18]=  width/2.f; verts[19]=  height/2.f; verts[20]=  depth/2.f;
verts[21]=  width/2.f; verts[22]=  height/2.f; verts[23]= -depth/2.f;
// back
verts[24]= -width/2.f; verts[25]=  height/2.f; verts[26]=  depth/2.f;
verts[27]= -width/2.f; verts[28]= -height/2.f; verts[29]=  depth/2.f;
verts[30]=  width/2.f; verts[31]= -height/2.f; verts[32]=  depth/2.f;
verts[33]=  width/2.f; verts[34]=  height/2.f; verts[35]=  depth/2.f;
// front
verts[36]= -width/2.f; verts[37]=  height/2.f; verts[38]= -depth/2.f;
verts[39]= -width/2.f; verts[40]= -height/2.f; verts[41]= -depth/2.f;
verts[42]=  width/2.f; verts[43]= -height/2.f; verts[44]= -depth/2.f;
verts[45]=  width/2.f; verts[46]=  height/2.f; verts[47]= -depth/2.f;
// top
verts[48]= -width/2.f; verts[49]=  height/2.f; verts[50]=  depth/2.f;
verts[51]= -width/2.f; verts[52]=  height/2.f; verts[53]= -depth/2.f;
verts[54]=  width/2.f; verts[55]=  height/2.f; verts[56]= -depth/2.f;
verts[57]=  width/2.f; verts[58]=  height/2.f; verts[59]=  depth/2.f;
// bottom
verts[60]= -width/2.f; verts[61]= -height/2.f; verts[62]=  depth/2.f;
verts[63]= -width/2.f; verts[64]= -height/2.f; verts[65]= -depth/2.f;
verts[66]=  width/2.f; verts[67]= -height/2.f; verts[68]= -depth/2.f;
verts[69]=  width/2.f; verts[70]= -height/2.f; verts[71]=  depth/2.f;

norms.resize(72);
// left
norms[0] = -1.f; norms[1] =  0.f; norms[2] =  0.f;
norms[3] = -1.f; norms[4] =  0.f; norms[5] =  0.f;
norms[6] = -1.f; norms[7] =  0.f; norms[8] =  0.f;
norms[9] = -1.f; norms[10]=  0.f; norms[11]=  0.f;
// right
norms[12]=  1.f; norms[13]=  0.f; norms[14]=  0.f;
norms[15]=  1.f; norms[16]=  0.f; norms[17]=  0.f;
norms[18]=  1.f; norms[19]=  0.f; norms[20]=  0.f;
norms[21]=  1.f; norms[22]=  0.f; norms[23]=  0.f;
// back
norms[24]= -0.f; norms[25]=  0.f; norms[26]=  1.f;
norms[27]= -0.f; norms[28]= -0.f; norms[29]=  1.f;
norms[30]=  0.f; norms[31]= -0.f; norms[32]=  1.f;
norms[33]=  0.f; norms[34]=  0.f; norms[35]=  1.f;
// front
norms[36]= -0.f; norms[37]=  0.f; norms[38]= -1.f;
norms[39]= -0.f; norms[40]= -0.f; norms[41]= -1.f;
norms[42]=  0.f; norms[43]= -0.f; norms[44]= -1.f;
norms[45]=  0.f; norms[46]=  0.f; norms[47]= -1.f;
// top
norms[48]= -0.f; norms[49]=  1.f; norms[50]=  0.f;
norms[51]= -0.f; norms[52]=  1.f; norms[53]= -0.f;
norms[54]=  0.f; norms[55]=  1.f; norms[56]= -0.f;
norms[57]=  0.f; norms[58]=  1.f; norms[59]=  0.f;
// bottom
norms[60]= -0.f; norms[61]= -1.f; norms[62]=  0.f;
norms[63]= -0.f; norms[64]= -1.f; norms[65]= -0.f;
norms[66]=  0.f; norms[67]= -1.f; norms[68]= -0.f;
norms[69]=  0.f; norms[70]= -1.f; norms[71]=  0.f;

Воксель выглядит отлично, но по сторонам нет разницы в цвете. Я использую sfml для управления окнами, если кто-то хочет знать.

1

Решение

Хорошо, после того, как я просто признал, что мое освещение было неправильным в течение пары месяцев, я понял, что передаю цвет в виде числа с плавающей точкой от 0-255 вместо 0f до 1.f. Изменение диапазона на 0.f-1.f исправило освещение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]