2

我正在尝试检查透明度及其工作原理。

我在其中创建了一个solidsphere 和一个solidcube。我已启用

glEnable(GL_BLEND);  
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

透明度使用 color4f 按预期工作。
问题是当我将球体的透明度设置为 1.0 时,立方体仍然出现。

我也在使用这些:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); 
glClearDepth(1); 
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glEnable(GL_CULL_FACE);  
glFrontFace(GL_CW);

仅当球体的透明度为 != 1.0 时,如何使立方体可见?

4

1 回答 1

2

你设定的理由是glFrontFace(GL_CW);什么?默认值为GL_CCW,因此您将剔除正面并渲染背面。由于缺少球体的前部,您会看到它的内部。

详细说明:

使用法线 (src_alpha , 1-src_alpha) 混合渲染半透明对象时,需要按深度顺序从后向前渲染半透明表面。

如果仅渲染对象的背面,它可能(如果它或多或少对称)看起来是正常的,但实际上它是由内向外的,因此无法正确遮挡实际上在其中的对象。

因此,要使其工作,重要的是不剔除前表面,并且首先渲染不透明或更远的对象。

如果您希望球体的正面和背面都正确且半透明地渲染,则需要先渲染背面,然后再渲染正面。这可以通过多边形排序来完成,但对于凸对象,只需渲染两次就足够了,背面剔除倒置 - 所以先渲染背面,然后再渲染正面,在两个单独的通道中。

于 2012-12-23T14:03:50.803 回答