安卓surfacetexture用unity显示
unity3d吧
全部回复
仅看楼主
level 10
kiteBoogaloo 楼主
妈蛋花了近乎一个月时间终于把android 层的camera frame(surfacetexture)用unity显示出来了。
社区上一群sb都在问,没几个解出来的,难得两个解出来的放asset一个卖70刀,一个卖150刀,你tm在逗我?
去tmd,我隔几天就把代码免费开源扔上去,卖他妹!
2017年01月13日 03点01分 1
level 13
[大拇指]
2017年01月13日 07点01分 2
level 8
[惊讶]
2017年01月14日 20点01分 3
level 9
最近也被这个问题困扰着。楼主是怎么解决的啊?
2017年01月15日 14点01分 8
unity不支持gles的oes类texture,因此java处产生的surfacetexture不能直接传给unity要用fbo把surfacetexture->oes texture->sampler2D texture,然后再传给unity Texture2D就可以了
2017年01月15日 15点01分
其中注意gles2和gles3的区别,最好编译时候强制你的unity使用其中一种固定的API,然后每行的gles代码都使用glerror检查看有什么错误
2017年01月15日 15点01分
顺便搜索unity surfacetexture等都能找到相关信息,尽管他们大部分都没有最终解决问题,但是还是相当接近答案了
2017年01月15日 15点01分
最后每次运行完java的texture update(fbo render)以后,unity层要进行一次gl invalidate state
2017年01月15日 15点01分
level 1
unity不支持gles的oes类texture,因此java处产生的surfacetexture不能直接传给unity要用fbo把surfacetexture->oes texture->sampler2D texture,然后再传给unity Texture2D就可以了
请问老兄 Opengl ES FBO 把 GL_TEXTURE_EXTERNAL_OES 转换为 GL_TEXTURE_2D 怎么玩?
2017年02月26日 13点02分 9
OpenGL找render to texture,有专门的教程,你再把它转换成OpenGLes的API
2017年02月26日 15点02分
然后最后关键是unity调用之后要gl invalidatestate
2017年02月26日 15点02分
创一个frame buffer,好像基本上所有的教程都会是rendere to texture2d的教程,所以那部份都是通用的。然后oes texture的render 也很容易找到,你唯一需要的就是学会使用fbo而已
2017年02月26日 15点02分
@kiteBoogaloo 大佬,代码整理好没,可以给参考下吗,有偿的
2020年07月09日 08点07分
level 1
老兄可以提点几个方法函数么? 我感觉我是不是走偏了。
2017年02月27日 02点02分 10
其实最烂最不完整的方法是直接就用jar画oes texture(完全不用管unity衔接),然后unity那边调用完jar以后立刻gl invalidateState
2017年02月27日 03点02分
你首先要在纯android环境保证你的oes gles渲染方法是没错的
2017年02月27日 03点02分
然后再变成jar,然后unity调用完就直接gl invalidate state
2017年02月27日 03点02分
@kiteBoogaloo 恩 渲染应该是好的,可以出图像。 我试过用 TextureView 在android这边画出来, 然后 用 Bitmap 存到GL_TEXTURE_2D unlty 那边每帧调用生成bitmap再绑定。 图像可以出来 就是太耗了 只有10 多的FPS。
2017年02月27日 04点02分
level 1
我是 企图 拷贝这个数据过去。
用的这种方法
GLuint fbo;glGenFramebuffers(1,&fbo);
/// bind the FBO
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
/// attach the source texture to the fbo
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, src_id, 0);
/// bind the destination textureglBindTexture(GL_TEXTURE_2D, dest_id);/// copy from framebuffer (here, the FBO!) to the bound texture
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width,height);
似乎 glCopyTexSubImage2D这个又不支持 OES 的格式
2017年02月27日 02点02分 11
不用做subimage copy
2017年02月27日 03点02分
fbo用texture2d的,然后用一个texture2d的gltexture去接着oes texture
2017年02月27日 03点02分
render to texture
2017年02月27日 03点02分
可以给我参考一下代码吗?
2017年10月15日 09点10分
level 1
那就是这样?
//先给 生成个 SurfaceTexture 并为他 生成个 纹理ID
int SurfaceTextureId;
int[] SurfaceIdContainer = new int[1]
GLES20.glGenTextures(1, SurfaceIdContainer, 0);
SurfaceTextureId=textureIdContainer[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,SurfaceTextureId);
texture=new SurfaceTexture(SurfaceTextureId);
texture.setOnFrameAvailableListener(this);
//再来个 texture2d
int TextureId;
int[] textureIdContainer = new int[1]
GLES20.glGenTextures(1, textureIdContainer, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureIdContainer[0]);
TextureId=textureIdContainer[0];
然后这个 TextureId 传给 unity 调用外部纹理
Texture2D.CreateExternalTexture(Screen.width, Screen.height, TextureFormat.BGRA32, false,false, (IntPtr)textureId);
//接着 创建个 FBO
int handle[] = { 0 };
GLES20.glGenFramebuffers(1, handle, 0);
int mFrameBufferID = handle[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferID);
//然后就等 onFrameAvailable调用时 在里面
texture.updateTexImage();
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferID);
//把SurfaceTexture 的纹理加到这个 FBO ?
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, SurfaceTextureId, 0);
//然后绑定那个2D 图片?
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, TextureId);
2017年02月27日 04点02分 12
基本原理是这样没错,API call的顺序细节我没看我的代码也不记得了,你找gles fbo渲染的标准抄一下变一下就是了
2017年02月27日 09点02分
能指导下吗?
2018年11月30日 09点11分
GLES API只能在有上下文的线程调用,那这个上下文是怎么获得的呢,是在java端生成,还是直接在unity端GL.issuepluginevent?
2021年02月02日 02点02分
level 1
然后我就不知道是不是这样的了
2017年02月27日 04点02分 13
level 1
不行啊
texture.updateTexImage();
int handle[] = { 0 };
GLES20.glGenFramebuffers(1, handle, 0);
mFrameBufferID = handle[0];
GLES30.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,mFrameBufferID);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, SurfaceId, 0);
<------------- 我试了一下午, 到这里就报错 <core_glFramebufferTexture2D:2537>: GL_INVALID_OPERATION 似乎 Surface 的 纹理加不进去的样子。
我对 OPENGL 完全是白痴。
不如老司机带带路? 给看看代码? 我感觉这个问题就只有你一个司机可以带了。
google 上面的根本就不是司机。
2017年02月27日 09点02分 14
你应该也知道其实就是某一两步API call错了,我这几天忙(以及懒)没空看我的代码[滑稽]
2017年02月27日 21点02分
先在android把fbo弄好了,unity那边没什么复杂的东西
2017年02月27日 21点02分
求助啊,我也出现了这个问题,怎么解决的?
2018年12月19日 09点12分
level 1
老兄, 我还是没有好。 搞了很久了哈。
要不你私信我你的QQ ,帮我缕缕代码?
我给你发个红包。
2017年03月01日 06点03分 18
你开个git repo把必要的代码放上去然后把链接给我
2017年03月01日 17点03分
@kiteBoogaloo 请问怎么解决的?我现在的需求是:RTSP视频流可以在surfaceTexture上播放,然后我想把视频流转到unity的texture2D上,关键就在怎么把surfaceTexture的信息转到unity的texture2D上。请问怎么解决呢?如有RMB需要可以提
2017年05月11日 06点05分
@kiteBoogaloo 我QQ807183087
2017年05月11日 06点05分
level 1
多谢老兄指点, 我一不小心居然试出来了。
活活整了接近20天啊。
2017年03月02日 16点03分 24
早说了是差那么一点[滑稽]
2017年03月02日 16点03分
老司机,能带一下么,我也遇到了这个问题,整了好几天不知道在哪出的错
2017年03月15日 04点03分
回复 ulepgyiy :至少得给出代码,自己得先写到他这程度吧?否则直接用别人代码出了问题你自己都不知道怎么解决。
2017年03月15日 04点03分
请问怎么解决的?我现在的需求是:RTSP视频流可以在surfaceTexture上播放,然后我想把视频流转到unity的texture2D上,关键就在怎么把surfaceTexture的信息转到unity的texture2D上。请问怎么解决呢?如有RMB需要可以提
2017年05月11日 06点05分
level 6
路过
2017年03月16日 01点03分 25
level 1
你好,请问代码整理出来了没呢?我也遇到了这个问题,想请教一下,谢谢。
2017年05月09日 09点05分 26
能否加我QQ,一起讨论下?
2017年05月10日 07点05分
@d_uanrock 你也是要把camera frame从unity显示吗?
2017年05月10日 08点05分
@T_1600 我是想把一张图片在android端转成texture后,将textureid传到unity端显示出来,你的问题也还没有解决吗?,我可以把我的代码发出来
2017年05月10日 10点05分
@d_uanrock 我也还没解决,还在弄。
2017年05月10日 11点05分
level 1
楼主,能不能分享一下代码啊?我按这里说的方法试了,但是仍然没有画出来http://stackoverflow.com/questions/33324753/how-to-use-unity-createexternaltexture-on-android
关键是没有报任何错误,不知道问题出在哪。
有也在弄这个问题的,希望可以讨论或者请教一下:QQ1908651048,谢谢了!
2017年05月10日 07点05分 27
1 2 3 尾页