【发布时间】:2019-09-10 16:49:01
【问题描述】:
我正在渲染一个带有轮廓的四边形。我通过将所需大小的四边形渲染为黑色来做到这一点,然后渲染“内部”四边形比第一个小。我还希望这个轮廓四边形是透明的。
我当前的尝试呈现如下:
但是我遇到的问题是,因为我实际上是在渲染两个四边形,所以黑色的“主”四边形会融合到较小的“内部”四边形。我不希望这种情况发生,因为我希望混合只混合背景和“内部”四边形颜色。
除了为轮廓渲染单独的四边形/三角形外,还有一种方法(理想情况下不使用着色器,因为我使用的是固定管道)在混合“内部”四边形时使混合忽略/不渲染“主”四边形?
相关代码:
混合模式:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable( GL_BLEND );
渲染盒子:
struct vertex
{
GLfloat x,y;
};
void draw_box()
{
glPushMatrix();
glTranslatef( -3.0f, 1.12f, 1.0f );
// Draw a huge black quad
const vertex vertices2[] =
{
{ -1.0f, -1.0f },
{ 0.0f, 0.0f },
{ -1.0f, 0.0f },
{ -1.0f, -1.0f },
{ 0.0f, 0.0f },
{ 0.0f, -1.0f },
};
glVertexPointer(2, GL_FLOAT, 0, vertices2);
glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
glDrawArrays(GL_TRIANGLES, 0, 6);
// Draw a smaller grey quad
const GLfloat space = 0.04f;
const vertex vertices3[] =
{
{ -1.0f+space, -1.0f+space },
{ 0.0f-space, 0.0f-space },
{ -1.0f+space, 0.0f-space },
{ -1.0f+space, -1.0f+space },
{ 0.0f-space, 0.0f-space },
{ 0.0f-space, -1.0f+space },
};
glVertexPointer(2, GL_FLOAT, 0, vertices3);
glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
glDrawArrays(GL_TRIANGLES, 0, 6);
glPopMatrix();
}
【问题讨论】: