我正在尝试将我们的一个应用程序从托管 DirectX 转换为 C# 中的 OpenGL,因此它将与 Windows 8 兼容。我们需要的一个关键功能是透明度,为了实践,我尝试使用创建一些透明形状NeHe 第 2 课C# 项目。似乎即使我添加glEnable(GL_BLEND)
and glColor4ub(255, 255, 255, 128)
,我也没有任何透明度。
对于这个测试项目,我只是复制了上面链接的 C# 项目,并更改了 2 个函数。对于InitGL()
,我添加了必要的行(或者我被告知)以使 alpha 混合工作。
private bool InitGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// These are the lines I've added
glEnable(GL_BLEND); // Add alpha blending
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Use this alpha function
glEnable(GL_CULL_FACE); // Don't render the backface
return true; // Initialization Went OK
}
对于DrawGLScene()
,我为每个顶点绘制带有颜色的三角形和四边形。
public bool DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glColor4ub(255, 0, 0, 128); // Transparent red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glColor4ub(0, 255, 0, 128); // Transparent green
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glColor4ub(0, 0, 255, 128); // Transparent blue
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glColor4ub(0, 0, 255, 128); // Transparent red
glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right
glColor4ub(0, 255, 0, 128); // Transparent green
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left
glColor4ub(255, 0, 0, 128); // Transparent blue
glVertex3f(0.0f, -1.0f, 1.0f); // Top
glEnd();
glTranslatef(3.0f,0.0f,0.0f);
glBegin(GL_QUADS);
glColor4ub(0, 255, 255, 128); // Transparent Cyan
glVertex3f(1.0f, 1.0f, 0.0f); // Top Right
glColor4ub(255, 255, 0, 128); // Transparent Yellow
glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
glColor4ub(255, 255, 255, 128); // Transparent White
glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
glColor4ub(255, 0, 255, 128); // Transparent Magenta
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
return true;
}
我已经在 Windows 8 和 7 上对此进行了测试,但两者似乎都没有表现出任何透明度。这是为什么?