我应该如何绘制一侧彩色三角形opengl

时间:2015-06-04 02:04:42

标签: opengl colors elements vertices

我研究了如何从COLLADA .dae文件中读取元素颜色,但我不确定如何在opengl中渲染彩色元素。要渲染元素,我使用glDrawElements

两个彩色三角形可以完美重叠,每个只有一个面部着色。我该如何实现呢?如何选择三角形的哪一边显示颜色?

据我所知,xml“sid”属性根据顶点的顺序识别要着色的三角形的边,并且看起来生成文件的软件选择使用两个单独的三角形,每个颜色边一个 我已经成功绘制了法线和位置顶点数据,现在我需要能够将颜色应用于元素。

1 个答案:

答案 0 :(得分:1)

听起来您的模型是由单面三角形组成的,因此双面曲面由两个面向相反方向的单面曲面表示。要正确绘制它,您只需要使用OpenGL的内置背面剔除来仅绘制每个三角形的正确边。

OpenGL根据顶点的顺序区分三角形的“前”和“后”。默认情况下,“前”是顶点以逆时针顺序出现的一侧。您可以通过调用glFrontFace(GL_CW)将其更改为顺时针方向,但为了参数,我将假设您使用逆时针方式,因为它是默认值。

  

据我所知,xml“sid”属性根据顶点的顺序识别要着色的三角形的边

从上面可以看出,表面的两边是否以相反的顺序存储在文件中,或者两个三角形的顶点是否以相同的顺序存储,这一点尚不清楚并且“sid”属性告诉您哪一个是前面,哪个是后面。我将假设对立面是相反的;如果不是这样,你需要使用“sid”来决定在为OpenGL构建顶点数组时要反转哪些。

如果曲面的两边以相反的顺序存储顶点,则它们都遵循相同的逆时针规则。假设你的表面一侧是红色而另一侧是蓝色。从红色侧面看,红色三角形的顶点以逆时针顺序出现,蓝色三角形的顶点是顺时针方向。如果你转过来看蓝色边,蓝色三角形的顶点现在是逆时针方向,红色现在是顺时针方向。基于此,OpenGL可以确定您正在查看一个三角形的“前面”和另一个三角形的“后面”。

然后,您需要做的就是告诉OpenGL只绘制每个三角形的正面:

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

这使得OpenGL“剔除”(不是绘制)一个三角形,如果可见的一侧是“背面”。当观察者看到表面的红色边时,将绘制红色三角形(因为它的“前面”面向相机),而蓝色三角形则不会(因为它的“后面”面向相机)。当观察者看到表面的蓝色边时,绘制蓝色三角形而不绘制红色三角形。两个三角形重叠,但只绘制了一个或另一个,而不是两个。

启用背面剔除后,您不需要对双面曲面进行任何其他特殊处理。只需用自己的颜色绘制每个三角形,然后让OpenGL剔除那些面向错误方向的三角形。