我有一个我在Android中反复玩的应用程序,它使用opengl-es.
目前我从位图加载纹理,如下所示:
//Load up and flip the texture - then dispose the temp
Bitmap temp = BitmapFactory.decodeResource(Deflecticon.getContext().getResources(), resourceID);
Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), temp.getHeight(), flip, true);
temp.recycle();
//Bind the texture in memory
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
//Set the parameters of the texture.
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//On to the GPU
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
Run Code Online (Sandbox Code Playgroud)
显而易见的问题是我使用的纹理必须是2的幂.目前我正在预编辑photoshop中的纹理是2的幂并且只有空边框.然而,这有点乏味,我希望能够像它们一样加载它们.认识到它们不是2的力量并将它们加载到纹理中.
我知道我可以缩放位图以成为2尺寸的力量并简单地拉伸纹理但是我不希望拉伸纹理,并且在某些情况下可能想要将几个纹理放入一个"图集"中.
我知道我可以使用glTexSubImage2D()将纹理粘贴到我想要的原点所需的数据中.这很棒!
但是我不知道如何在Android中初始化没有数据的纹理?
在这个问题中,之前提出的建议是调用没有数据的glTexImage2D()然后填充它.
但是在android中调用"GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0)"时; 你没有指定宽度/高度.它从我假设的位图读取.
做这个的最好方式是什么?我可以创建一个只有2个大小的正确幂的新位图,并且没有填充任何数据并使用它初始化纹理然后使用subImage粘贴到它中吗?或者我应该以某种方式将新的位图以某种方式复制到我想要的像素(不确定是否可以轻松完成)到这个新的位图(离开边框)然后使用它?
编辑:澄清我正在使用opengl.
我有一组点,每个点都有一个"影响"或基本上是半径的区域.我希望能够将所有点的这些影响圈中的每一个绘制为简单的圆形线.
它们会重叠,但我希望画出形状的外部.我知道这可能需要我在他们相交的地方锻炼,并以某种方式形成一个完整的形状来绘制.问题是某些点可能甚至没有触及其他点!所以我也需要能够解决这个问题.
我试图说明我的意思:
请注意,我希望简单地画出黑线,没有填充.这是因为我希望透过背景图像和其他几何图形.
我会在openGL中这样做,所以这个圆圈可能是用GL_LINES或其他一些形成曲线的顶点制作的,但我真的不知道如何计算出这个边界.
如果有人有任何建议或者可以指出我将如何解决这个问题,我将不胜感激!
这可能更像是一个数学问题,我不是在寻找代码,而是实际上如何去研究这些形状.我只是想不出怎么做!
*****编辑:我提出的解决方案,希望可以帮助别人!
所以我使用了建议的想法,并且基本上决定了使用模板缓冲区绘制的最佳方法.这现在意味着我循环我的点3次,但我需要仔细分类它们,无论如何只能找到可见的.
所以代码明智我现在有这个:
private void stencilCircleAroundStars()
{
//Lets try and draw something here using stencil
glColorMask(false, false, false, false); //Disable colour mask
glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle
glDisable(GL_DEPTH_TEST);// Disable Depth Testing
for (Object value : stars.values())
{
Star star = (Star)value;
glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any …
Run Code Online (Sandbox Code Playgroud) 我正在写一个小应用程序,目前生成一个随机的纹理贴图.
我将此地图绘制为10 x 15组"四边形",其实际上是所有三角形条带.我使用"map"来获取一个int,然后我将其作为textureAtlas中此方块的纹理位置.所以例如0是左下角的"瓦片".图集为128 x 128,分为32像素图块.
然而,我似乎得到了一些奇怪的文物,其中来自一个瓷砖的纹理爬进到下一个瓷砖.我想知道它是否是图像本身,但据我所知,像素正好在它们应该的位置.然后我查看了我指定的纹理坐标,但它们看起来都很精确(0.0,0.25,0.5,0.75,1.0-将它分成我期望的4行和列).
奇怪的是,如果我在模拟器上运行它,我没有得到任何工件.
是否有我错过的设置会导致1像素的出血?它似乎也只是垂直的 - 这可能与手机有关我在那个方向"拉伸"图像,因为手机的屏幕在那个方向上比正常大.
我像这样加载纹理:
//Get a new ID
int id = newTextureID(gl);
//We will need to flip the texture vertically
Matrix flip = new Matrix();
flip.postScale(1f, -1f);
//Load up and flip the texture
Bitmap temp = BitmapFactory.decodeResource(context.getResources(), resource);
//Store the widths for the texturemap
int width = temp.getWidth();
int height = temp.getHeight();
Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, width, height, flip, true);
temp.recycle();
//Bind
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
//Set params
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, …
Run Code Online (Sandbox Code Playgroud) 下午好.
我不熟悉android中的活动生命周期并尽可能地阅读,但我无法想出如何以一种很好的方式解决以下问题.
我有一个带有GLSurfaceView的活动,可以在屏幕上绘制各种内容.在这个GLSurfaceView的渲染线程中,我执行所有渲染以及实际更新逻辑(我最终会将其分离出来).
我遇到的麻烦来自渲染器中绘制的一个"屏幕"我希望结束Activity并让它调用各种生命周期方法.
通常我可以使用System.exit(0)执行此操作; 但是以这种方式结束活动似乎并没有调用OnStop(); 的OnDestroy(); 方法.
这可能只是我愚蠢而没有看到这样做的简单方法,但有没有办法访问Activity并调用activity.finish(); 无需将参考文件一直传递下去?
这可能不是一个Android问题,更像是一般的java问题?对不起,我两个都有点生疏了.也许如果有人能够大致解释他们如何在他们的应用程序中处理这样的问题.
我有一个应用程序,我正在开发多人游戏.但是我没有2部手机,所以我一直在我的电脑上运行一个单独的程序(注意:不是模拟器!),它模拟我的程序和多人游戏方面.
但是在PC上我有以下代码:
Packet input = inputQueue.take();
if (clientAddress == input.getAddress())
{
switch (input.type)
{
Run Code Online (Sandbox Code Playgroud)
这很好用,Packet只是一个简单的类,我写的是从Datagram包中获取信息,getAddress()返回一个InetAddress.客户端地址先前已在代码中设置.
然而,Android应用程序具有完全相同的代码,字面上的行完全相同,这个InetAddress不会等同于另一个?如果我使用getHostName()或其他东西获取2 InetAddress的字符串并进行比较,那么它就等于另一个.
我做错了什么并且通过思考我可以将这两个对象与==符号进行比较来假设一些东西?它应该是.equals()吗?我以为android使用相同的java.net代码,但可能有区别吗?
使用InetAddress确保我拥有相同地址的最佳方法是什么?