使用opengl对模型的双面渲染出不同颜色

在这里插入图片描述
紫色是正面,黄色是反面,红色是刷选中的部分。

void ViewSpace::CShowShader::ShaderFrontAndBack(TriMesh* Tmesh)
{
	Tmesh->need_Facenormals();
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	int fn = Tmesh->faces.size();

	glCullFace(GL_BACK); // 剔除背面
	glEnable(GL_CULL_FACE); // 启用剔除功能
	//选中面片渲染--红色
	bool flag = false;
	for (int i = 0; i < fn; i++)
	{
		if (Tmesh->faces[i].beSelect)
		{
			COpenglToolFunction::SetMaterialColor(RGB(255, 20, 147));//设置光照
			flag = true;
			break;
		}
	}
	if (flag)
	{
		glEnable(GL_CULL_FACE); // 启用剔除功能
		for (int i = 0; i < fn; i++)
		{
			if (Tmesh->faces[i].beSelect)
			{
				glBegin(GL_TRIANGLES);
				glNormal3f(Tmesh->FaceNormal[i][0], Tmesh->FaceNormal[i][1], Tmesh->FaceNormal[i][2]);
				TriMesh::Face& f = Tmesh->faces[i];
				vector<vec>& v = Tmesh->vertices;
				//glColor4f(255.0 / 255, 20.0 / 255, 147.0 / 255, 1);
				glVertex3f(v[f[0]][0], v[f[0]][1], v[f[0]][2]);
				glVertex3f(v[f[1]][0], v[f[1]][1], v[f[1]][2]);
				glVertex3f(v[f[2]][0], v[f[2]][1], v[f[2]][2]);
				glEnd();
			}
		}
	}
	//渲染背面--黄色
	COpenglToolFunction::SetMaterialColor(RGB(255,255,0)); // 颜色设置
	for (int i = 0; i < fn; i++)
	{
		glBegin(GL_TRIANGLES); // 开始绘制三角形
		glNormal3f(Tmesh->FaceNormal[i][0], Tmesh->FaceNormal[i][1], Tmesh->FaceNormal[i][2]);
		TriMesh::Face& f = Tmesh->faces[i];
		vector<vec>& v = Tmesh->vertices;
		glVertex3f(v[f[0]][0], v[f[0]][1], v[f[0]][2]);
		glVertex3f(v[f[2]][0], v[f[2]][1], v[f[2]][2]);
		glVertex3f(v[f[1]][0], v[f[1]][1], v[f[1]][2]);
		glEnd(); // 结束绘制
	}
	//正面渲染--紫色
	COpenglToolFunction::SetMaterialColor(RGB(218, 112, 214)); // 颜色设置
	for (int i = 0; i < fn; i++)
	{
		glBegin(GL_TRIANGLES); // 开始绘制三角形
		glNormal3f(Tmesh->FaceNormal[i][0], Tmesh->FaceNormal[i][1], Tmesh->FaceNormal[i][2]);
		TriMesh::Face& f = Tmesh->faces[i];
		vector<vec>& v = Tmesh->vertices;
		glVertex3f(v[f[0]][0], v[f[0]][1], v[f[0]][2]);
		glVertex3f(v[f[1]][0], v[f[1]][1], v[f[1]][2]);
		glVertex3f(v[f[2]][0], v[f[2]][1], v[f[2]][2]);
		glEnd(); // 结束绘制
	}
	//渲染背景
	glDisable(GL_CULL_FACE); // 禁用剔除功能
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在QT中使用OpenGL渲染一个OBJ模型,可以按照以下步骤进行: 1. 创建一个QT项目,选择OpenGL窗口模板。 2. 在OpenGL窗口中初始化OpenGL和QT的集成,可以使用以下代码: ```c++ void GLWidget::initializeGL() { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); } void GLWidget::resizeGL(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 0.01, 100.0); glMatrixMode(GL_MODELVIEW); } void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(rotationX, 1.0, 0.0, 0.0); glRotatef(rotationY, 0.0, 1.0, 0.0); drawModel(); } ``` 3. 加载OBJ模型,并将其渲染OpenGL窗口中,可以使用以下代码: ```c++ void GLWidget::loadModel(QString filename) { model = glmReadOBJ(filename.toStdString().c_str()); glmUnitize(model); glmFacetNormals(model); glmVertexNormals(model, 90); } void GLWidget::drawModel() { if (model != NULL) { glmDraw(model, GLM_SMOOTH); } } ``` 4. 在QT的主窗口中添加一个QPushButton,点击按钮后调用loadModel()函数加载OBJ模型。 ```c++ void MainWindow::on_btnLoad_clicked() { QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("OBJ Files (*.obj)")); if (!filename.isEmpty()) { ui->glWidget->loadModel(filename); } } ``` 5. 运行程序,点击按钮加载OBJ模型并在OpenGL窗口中显示。 以上就是在QT中使用OpenGL渲染OBJ模型的基本步骤,需要注意的是,这里使用OpenGL Utility Toolkit(GLUT)和OpenGL Mathematics(GLM)库来帮助加载OBJ模型和进行矩阵变换等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值