opengl - Setting transparency color on sprite bitmap makes my non-sprite quads vanish! -
writing simple game learn opengl. in current version, render method draws geometry quads code defined colors , renders sprites. far, normal , working intended. sprites have background color auqua i've been meaning set transparent, haven't yet. moment game looks normal except fact sprites appear bounded color blue. i'm @ point want blue vanish , instead transparent, modify onload method be:
... bitmap bitmap = new bitmap("rocktexture.bmp"); // existing line bitmap.maketransparent(color.aqua); // new line ... however, when run game geometry quads vanish screen! sprites remain , appear appropriately transparent.
i'm not sure why happening. here render method:
protected override void onrenderframe(frameeventargs e) { base.onrenderframe(e); gl.clear(clearbuffermask.colorbufferbit); gl.begin(beginmode.quads); color prevcolor = default(color); foreach (var quad in _view.geomitrylist) { if (prevcolor != quad.color) { gl.color4(quad.color); prevcolor = quad.color; } gl.vertex2(quad.upperleftbound.x, quad.upperleftbound.y); gl.vertex2(quad.lowerrightbound.x, quad.upperleftbound.y); gl.vertex2(quad.lowerrightbound.x, quad.lowerrightbound.y); gl.vertex2(quad.upperleftbound.x, quad.lowerrightbound.y); } gl.color4(_unitcolor); // reset color multiplier not scew textures prevcolor = _unitcolor; gl.bindtexture(texturetarget.texture2d, _rocktextureid); foreach (var sprite in _view.spritelist) { float ulx = sprite.upperleftbound.x; float uly = sprite.upperleftbound.y; float lrx = sprite.lowerrightbound.x; float lry = sprite.lowerrightbound.y; gl.texcoord2(0, 0); gl.vertex2(ulx, uly); gl.texcoord2(1, 0); gl.vertex2(lrx, uly); gl.texcoord2(1, 1); gl.vertex2(lrx, lry); gl.texcoord2(0, 1); gl.vertex2(ulx, lry); } renderdashboard(ref prevcolor); gl.end(); gl.flush(); swapbuffers(); }
supposing you're setting alpha channel in maketransparent function, need enable blending:
protected override void onrenderframe(frameeventargs e) { base.onrenderframe(e);
gl.clear(clearbuffermask.colorbufferbit); gl.begin(beginmode.quads); color prevcolor = default(color); foreach (var quad in _view.geomitrylist) { if (prevcolor != quad.color) { gl.color4(quad.color); prevcolor = quad.color; } gl.vertex2(quad.upperleftbound.x, quad.upperleftbound.y); gl.vertex2(quad.lowerrightbound.x, quad.upperleftbound.y); gl.vertex2(quad.lowerrightbound.x, quad.lowerrightbound.y); gl.vertex2(quad.upperleftbound.x, quad.lowerrightbound.y); } vvv
gl.enable(gl_blend); ^^^
gl.blendfunc(gl_src_alpha, gl_one_minus_src_alpha); gl.color4(_unitcolor); // reset color multiplier not scew textures prevcolor = _unitcolor; gl.bindtexture(texturetarget.texture2d, _rocktextureid); foreach (var sprite in _view.spritelist) { float ulx = sprite.upperleftbound.x; float uly = sprite.upperleftbound.y; float lrx = sprite.lowerrightbound.x; float lry = sprite.lowerrightbound.y; gl.texcoord2(0, 0); gl.vertex2(ulx, uly); gl.texcoord2(1, 0); gl.vertex2(lrx, uly); gl.texcoord2(1, 1); gl.vertex2(lrx, lry); gl.texcoord2(0, 1); gl.vertex2(ulx, lry); } gl.end(); // think should go here. gl.disable(gl_blend); // enable , disable on as-needed base renderdashboard(ref prevcolor); gl.flush(); swapbuffers(); btw: you're using immediate mode calls there (glbegin(...), glvertex(...), glend()), should abandon them , use vertex arrays , vertex buffer objects instead. immediate mode deprecated, no longer available in opengl-3 , later outside compatibility profile.
Comments
Post a Comment