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

研究生搞三维图形,天天用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);
}

3、物体遮挡

有的时候,我们需要把一个三维的物体,置于另外一个物体的前面,不管这个这两个物体的世界坐标关系,就是要实现遮挡,这个时候可以采用:启用深度、关闭深度。具体的也给忘了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值