有没有办法让gluCylinder()的正面透明?

时间:2016-06-30 10:31:00

标签: opengl

我正在使用gluCylinder()在openGL中创建一个圆柱体,然后使用Depth Test On绘制圆柱体内的点。 当我看到圆柱体的前视图时,圆柱内的点被正面阻挡。

为了使圆柱体的正面半透明,我正在使用混合。

我正在使用以下功能。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

但无论我赋予圆柱体的颜色或alpha值,正面由于其背面而看起来都不透明。

判断是否可以仅使用混合,否则我需要为Cylinder的两个面引入光照。Here it clearly visible the change in the color of front face and back face of cylinder. And the points inside the cylinder are not visible due to being obstructed by front face of cylinder.

3 个答案:

答案 0 :(得分:1)

你应该能够通过两次绘制圆柱体来完成此操作,同时第一次剔除正面,然后第二次剔除背面。这样,您可以不同地绘制前部和后部,例如,通过使前部透明。

代码序列可能如下所示:

// Draw back part of cylinder, opaque.
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
gluCylinder(...);

// Draw points.

// Draw front part of cylinder, transparent.
glCullFace(GL_BACK);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gluCylinder(...);
glDisable(GL_BLEND);

答案 1 :(得分:0)

如果我理解你,那么不,你不能单独使用混合。

如果气缸的法线都指向外侧,那么无论你做什么,你也都无法看到气缸的内部零件。

我做类似的事情,在墙后面显示角色,它就像这样 - 正常渲染场景并将其全部保存到帧缓冲区。然后在顶部使用缓冲区内容渲染您想要显示的内容,使用自定义着色器在您想要显示的内容周围形成透明气泡。

不确定我是否正在解释它,但遗憾的是需要多个步骤来获得您想要的结果。

答案 2 :(得分:0)

尽管有图片,但我的问题仍然有点不清楚,但我会根据自己对你的问题的看法来回答。

您正在绘制圆柱体并在圆柱体内部具有几何体(线或其他模型)。您希望圆柱体看起来是半透明的,因此内部对象是可见的。这是一种方法。假设您的渲染函数是drawCylinder()drawPoints()

init()
{
 ...
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 ...
}

drawScene()
{
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
drawCylinder();
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
drawPoints();
}

这样做将确保无论圆柱体如何都绘制点。尝试使用较低的alpha值作为圆柱颜色。

请注意这是一种方法。我建议使用着色器来控制混合以及探索片段/像素丢弃选项。