我将游戏从WP7 XNA移植到Android;一切都在使用Canvas,但它太慢了,所以我按照Replica Island和SpriteMethodTest的例子切换到了OpenGL ES。
我的问题是,当我在绘制纹理之前立即设置glColor时,我的纹理没有被着色或变得透明 - 它被完全忽略,并且纹理是在加载状态下绘制的。纹理本身固有的所有颜色和透明度信息都可以正确应用。我也使用setPixels以编程方式生成一些位图,我在那里有完全相同的问题。
我仍然处于“OpenGL只是魔法咒语”阶段的理解:-(这使得遵循现有的文档,似乎针对中级或高级编码员,相当令人沮丧。我希望从这些样本中复制/粘贴是可行的,但我一定错过了一些东西,我无法弄清楚它是什么。我已经达到了代码盲目的地步,无法区分它们之间的区别代码和我的。
glColor4在Replica Island中显然有效,当我在同一个模拟器中运行时,所有文本在不透明度变化时淡入和淡出,就像它应该的那样。但它在我的代码中不起作用: - (
这是我的GL初始化代码:
surfaceCreated:
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glShadeModel(GL10.GL_FLAT);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
// gl.glDisable(GL10.GL_DITHER);
// gl.glDisable(GL10.GL_LIGHTING);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
sizeChanged:
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_TEXTURE_2D);
我注释掉了禁用抖动和照明以防万一...但没有。没有区别。
位图从资源加载:
gl.glGenTextures(1, mTextureNameWorkspace, 0);
textureName = mTextureNameWorkspace[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, srcBitmap, 0);
最后我的抽奖代码:
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop(src), 0);
gl.glColor4f(tint.R(), tint.G(), tint.B(), tint.A());
((GL11Ext) gl).glDrawTexfOES(dst.left, screenHeight - dst.bottom, 0.0f, dst.width(), dst.height());
色调成员的范围应为0.0..1.0。如果我设置了无效的纹理:
gl.glBindTexture(GL10.GL_TEXTURE_2D, -1);
...然后OpenGL必须在正确的位置绘制正确阴影和不透明度的矩形。
我必须尝试glBlendFunc的所有可能参数组合 - 其中一些参数部分影响透明度,但它们都没有正常工作,它们都不会导致glColor色调产生任何影响。
我所要做的就是相当于:
PorterDuff.Mode mode = PorterDuff.Mode.MULTIPLY;
if (tint.A() < 1.0f && tint.R() == 1.0 && tint.G() == 1.0
&& tint.B() == 1.0)
mode = PorterDuff.Mode.DST_IN;
Paint paint = new Paint();
PorterDuffColorFilter cf = new PorterDuffColorFilter(tint, mode);
paint.setColorFilter(cf);
canvas.drawBitmap(texture.bitmap, srcRect, dstRect, Paint(tint));