OpenGL ES 2.0,quad在背景改变时不会改变颜色

时间:2013-07-23 13:03:37

标签: opengl-es-2.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"

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

还有一个问题是你不能在这里讨论的Android Bitmap类中使用alpha纹理:

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