我正在渲染帶輪廓的四邊形。我通過將所需尺寸的四邊形渲染爲黑色來實現這一點,然後渲染「內部」四邊形比第一個更小。我也希望這個四邊形是透明的。OpenGL在混合時忽略對象?
我現在嘗試呈現爲這樣:
http://i39.tinypic.com/2eq993s.png
但是我有問題是因爲我基本上是呈現在彼此頂部的兩個四邊形,黑色的「主」四融合通過對較小的「內」四。我不希望發生這種情況,因爲我希望混合只能混合背景和「內部」四色。
除了爲輪廓渲染單獨的四邊形/三角形之外,還有一種方法(理想情況下不使用着色器,因爲我使用的是固定管道),以便在混合「內部」時忽略/不渲染「主」四?
相關代碼:
混合模式:
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();
}
我不確定我是否理解,所以深度緩衝區將免費夾住外四邊形內部部分?這是使用這種方法會發生什麼? – paulm
@paulm是的,它基本上是免費的,除非你之前根本沒有使用深度緩衝區,在這種情況下創建具有深度緩衝區的上下文將使用大約兩倍的幀緩衝區的內存,因爲每個像素需要通常情況下)對於24位深度緩衝區(最常見),3個字節的顏色數據(4個帶alpha)和(通常)3個字節,儘管16位深度緩衝區也很常見。 – bcrist
我認爲這仍然會產生與現在兩個四邊形混合的結果相同的不良結果,因爲這與玻璃的效果相同? – paulm