研究生搞三维图形,天天用opengl,然而毕业了一段时间后,发现以前使用opengl的一些小细节都忘了,以前都没有记录,突然感到后悔了……这边只能记录一些目前还记得的一些细节了,省的以后,连这些都给忘了。
1、顶点颜色
如果想要启用顶点颜色:
glBegin(GL_TRIANGLES); int a,b,c; a=model->faces[j].v[0]; b=model->faces[j].v[1]; c=model->faces[j].v[2]; glNormal3fv(&model->FaceNormal[j][0]); glColor3f(model->gray_color[a],model->gray_color[a],model->gray_color[a]); glVertex3fv(&model->vertices[a][0]); glColor3f(model->gray_color[b],model->gray_color[b],model->gray_color[b]); glVertex3fv(&model->vertices[b][0]); glColor3f(model->gray_color[c],model->gray_color[c],model->gray_color[c]); glVertex3fv(&model->vertices[c][0]); glEnd();
那么需要语句:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); glEnable(GL_COLOR_MATERIAL);
使用绘制完毕后,可用gldisable关闭。
2、二维绘制
有的时候,我们需要在opengl三维场景中,绘制一个二维的东西,这个时候可以采用加载单位矩阵的方式
void CParameterDecal::Render2D() { if(m_BePara_Faces.empty())return; GLint OrigViewport[4]; glGetIntegerv(GL_VIEWPORT,OrigViewport); glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glPushMatrix();//加载单位矩阵 glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glEnable (GL_LINE_SMOOTH); glHint (GL_LINE_SMOOTH, GL_NICEST); glEnable(GL_COLOR_MATERIAL); glColor3f(1,0,0); glLineWidth(1.0); float xyscale=(float)(OrigViewport[2]-OrigViewport[0])/(OrigViewport[3]-OrigViewport[1]); float squartlengthx=0.5; vec2 squartcenter(1-0.3,-1+xyscale*0.3); float dScalex=0.25* 1.0/ (m_Texture->t_fDecalRadius*1.1f); float dScaley=dScalex*xyscale; glTranslatef(squartcenter[0],squartcenter[1],0); glScalef(dScalex,dScaley,1); //绘制 int fn=m_Tmesh->faces.size(); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); for (int i=0;i<fn;i++) { if(!m_BePara_Faces[i])continue; if(m_PDEM->m_distortion[i]>0)glColor3f(1-m_PDEM->m_distortion[i],1-m_PDEM->m_distortion[i],1); else if(m_PDEM->m_distortion[i]<=0)glColor3f(1,1+m_PDEM->m_distortion[i],1+m_PDEM->m_distortion[i]); TriMesh::Face &f=m_Tmesh->faces[i]; glBegin(GL_TRIANGLES); for (int j=0;j<3;j++) { glVertex2f(m_Para_Result[f[j]][0],m_Para_Result[f[j]][1]); } glEnd(); } glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3f(0,0,0); for (int i=0;i<fn;i++) { if(!m_BePara_Faces[i])continue; TriMesh::Face &f=m_Tmesh->faces[i]; glBegin(GL_TRIANGLES); for (int j=0;j<3;j++) { glVertex2f(m_Para_Result[f[j]][0],m_Para_Result[f[j]][1]); } glEnd(); } glDisable(GL_LINE_SMOOTH); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glEnable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); }
有的时候,我们需要把一个三维的物体,置于另外一个物体的前面,不管这个这两个物体的世界坐标关系,就是要实现遮挡,这个时候可以采用:启用深度、关闭深度。具体的也给忘了