我在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"
答案 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纹理: