繁体   English   中英

具有顶点阵列的OpenGL照明

[英]OpenGL lighting with vertex arrays

我只是在编写一个简单的程序来使用顶点数组对象绘制体素。 当我运行程序时,我无法使照明正常工作,它看起来与未启用照明时的照明相同。 这是代码片段。 显示功能

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进行窗口显示。

在接受了几个月的照明错误之后,我意识到我将颜色从0-255而不是0.f传递到1.f。 将范围更改为0.f-1.f可固定照明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM