您的位置:首页 > 运维架构

基础知识(十二)Opengl回顾记录

2016-02-15 19:17 519 查看
研究生搞三维图形,天天用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,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关闭。

[b]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);
}


3、物体遮挡

有的时候,我们需要把一个三维的物体,置于另外一个物体的前面,不管这个这两个物体的世界坐标关系,就是要实现遮挡,这个时候可以采用:启用深度、关闭深度。具体的也给忘了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: