0

我在 OpenGL ES 2.0 的四边形中画了一个圆。片段着色器中的代码采用已设置的中心和半径,并在四边形内创建一个圆。这工作正常,直到我尝试更改背景颜色,因为四边形仍然显示为空白并且没有填充背景颜色/纹理。有没有一种简单的方法可以使四边形填充与背景相同的颜色/纹理,同时保持圆圈显示?

片段着色器中的代码如下:

"varying highp vec2 textureCoordinate;\n"

"const highp vec2 center = vec2(0.5, 0.5);\n"
"const highp float radius = 0.5;\n"

"void main()\n"
"{\n"
"highp float distanceFromCenter = distance(center, textureCoordinate);\n"
"lowp float checkForPresenceWithinCircle = step(distanceFromCenter, radius);\n"

"gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * checkForPresenceWithinCircle;\n"
"}\n"
4

2 回答 2

1

诀窍不是用背景填充四边形,而是避免在圆圈覆盖的区域之外替换它。

您的片段着色器将始终输出一个值 - 即使它在圆圈之外。也就是说,如果 checkForPresenceWithinCircle 为 0.0,则为 gl_FragColor 分配 vec4(0.0, 0.0, 0.0, 0.0) - 透明黑色。

我认为您正在寻找的是discard关键字,它可以防止着色器为该片段输出任何内容。就像是:

if ( checkForPresenceWithinCircle > 0.0 )
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
else
    discard;

由于您知道 alpha 在圆外为 0.0,在圆内为 1.0,因此您也可以使用 API 端的 alpha 混合来实现相同的效果:

draw_background();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
draw_circle();
glDisable(GL_BLEND);
于 2013-07-23T23:14:35.140 回答
0

gl_FragColor 的 alpha 部分通常从纹理中读取,如下所示:

vec4 vTexture = texture2D(gsuTexture0, gsvTexCoord);
gl_FragColor = vTexture;

另外,请确保您的颜色缓冲区清除的 alpha 设置为 0.0,如下所示:

glClearColor(fRed, fGreen, fBlue, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

还有一个问题是您不能将 alpha 纹理与 Android Bitmap 类一起使用,如下所述:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1/

于 2013-07-23T15:22:15.397 回答