根据标题,从暂停状态恢复后,GLSurfaceView为空白。恢复后,渲染器的onSurfaceCreated,onSurfaceChanged和onDrawFrame被调用,但屏幕仍为空白!
以下是相关代码:
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
boxWidth = 0.5f;
boxHeight = 0.5f;
boxCenter = new float[] { 0.5f, 0.5f };
Log.v("resume", "onSurfaceCreated");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 1, 0, 1, -5, 5);
gl.glMatrixMode(GL10.GL_MODELVIEW);
viewHeight = height;
viewWidth = width;
Log.v("resume", "onSurfaceChanged");
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glLoadIdentity(); …Run Code Online (Sandbox Code Playgroud) 可以在GLSurfaceView上添加LinearLayout吗?如何在GLSurfaceView上叠加LinearLayout?也许GLSurfaceView是Game playground,LinearLayout是菜鸟〜
在Android NDK中,是否可以使用典型的Java端GLSurfaceView模式(从GLSurfaceView.Renderer onDrawFrame,onSurfaceCreated等覆盖方法)使用OpenGL ES 1.1,同时在C++端使用帧,颜色和深度缓冲区,以及VBO?
我正在尝试使用它创建它们:
void ES1Renderer::on_surface_created() {
// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
glGenFramebuffersOES(1, &defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
// Create color renderbuffer object.
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
// create depth renderbuffer object.
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎这没有得到适当的上下文,我认为这是在初始化GLSurfaceView和渲染器时创建的(java端).
我不是NDK和OpenGLES的专家,但我必须移植一个使用OpenGL ES 1.1的iOS应用程序,我的目标是尽可能多地重用代码.由于应用程序还在利用特定于平台的UI组件(按钮,列表等),同时绘制GL图形,我认为这将是最好的方法.但是,我现在正在考虑使用本机活动,但我不确定与其他java组件的关系是什么.
我试图添加一个GLSurfaceView,但我得到的错误 - java.lang.ClassNotFoundException:android.view.GLSurfaceView;
java.lang.RuntimeException: Unable to start activity ComponentInfo{fashizel.mizi/fashizel.mizi.MyActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class GLSurfaceView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class GLSurfaceView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
at android.app.Activity.setContentView(Activity.java:1867)
at fashizel.mizi.MyActivity.onCreate(MyActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
Caused …Run Code Online (Sandbox Code Playgroud) 我目前正在使用纯OpenGL以自己的方式绘制按钮.
我可以通过onTouchEvent检测按钮是否被按下,但是我想知道用户是按住按钮,还是用户不再触摸屏幕.
我有一个UI,它有一个显示多边形的GLSurfaceView.
UI还有两个按钮ZoomIn和ZoomOut.当用户按下这些按钮时,将调用myGLSurfaceView的zoomIn()和zoomOut()方法.
问题是我希望调用onDrawFrame方法来反映放大和缩小.
我为什么要这个?因为按钮有setClickable(true); 为什么?因为我需要,如果用户离开手指按下按钮,则连续应用变焦,直到用户释放按钮.
现在它可以工作,但它工作不好,我需要刷新GLsurfaceview强制onDrawFrame
我试图在公共类上使用静态变量来在活动之间传递它们.
我这样做有一个罕见的问题.我给活动上的静态变量赋值.此活动调用GLSurfaceView并侦听屏幕方向更改.
如果我给GLSurfaceView上的静态变量赋值,那么,一切正常,值存储,并且我可以在屏幕方向更改后再次调用onCreate方法时检索它们.
问题是当我将值存储在GLSurfaceView类之外的静态变量上时,在活动的onTouchListener方法中.这些值没有正确存储在静态变量上,因为当我尝试在GLSurfaceView上访问它们时,这些值并不是它们所支持的值.
这是我的静态变量类:
public class MagazineStatus {
//clase utilizada para almacenar variables estáticas.
static int currentPage=1; //página actual
//Valores originales cuando pasamos de un modo a otro, por ejemplo, de portrait a landscape.
static float oScale=0.0f;
static float oX=0.0f;
static float oY=0.0f;
static float oZrot=0;
static boolean modeChanged=false; //indica si hemos cambiado de modo
(landscape/portrait)
}
Run Code Online (Sandbox Code Playgroud)
这里我将值存储在我的活动类中(我做了一个调试,显然它们正确存储):
for (int i=0;i<thumbnailLinearLayouts.size();i++){
final int auxIndex=i;
thumbnailLinearLayouts.get(i).setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
MagazineStatus.currentPage=auxIndex;
System.out.println("MagazineStatus.currentPage: "+MagazineStatus.currentPage);
return true; …Run Code Online (Sandbox Code Playgroud) 我有一个示例应用程序(完整源代码),使用MediaCodec对相机帧进行编码,同时在GLSurfaceView上显示它们.
Systrace确认每秒进行30次绘图调用:

但是,屏幕记录录制(.mp4,YouTube)显示明显的帧速率要低得多.
简而言之,我的编码和显示循环执行以下操作:
在Galaxy Nexus LTE和Nexus 7(均采用AOSP 4.4)上,应用程序按预期执行.到目前为止,只有Nexus 5在屏幕上绘制的帧数与明显的帧数之间存在差异......
我祈祷我不是疯了.
我徘徊了七个小时来解决我的问题.我创建了一个项目,其中我使用GLSurfaceView,我已经设置了一个图像,然后我使用EffectFactory类实现了不同的效果.
但我的问题是,当我拍摄带有影响的图像的屏幕截图时,它总是显示为黑屏而不是图像.我知道这可能是因为SurFaceview.但是,如果有任何建议可能对我有帮助.
提前致谢.
这是我的代码.
public class EffectsFilterActivity extends Activity implements
GLSurfaceView.Renderer {
private GLSurfaceView mEffectView;
private int[] mTextures = new int[2];
private EffectContext mEffectContext;
private Effect mEffect;
private TextureRenderer mTexRenderer = new TextureRenderer();
private int mImageWidth;
private int mImageHeight;
private boolean mInitialized = false;
int mCurrentEffect;
public void setCurrentEffect(int effect) {
mCurrentEffect = effect;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public …Run Code Online (Sandbox Code Playgroud) 我想将摄像机输出渲染到视图中,偶尔将摄像机输出帧保存到文件中,约束为 - 保存的帧应该与摄像机配置的分辨率相同,而视图小于相机输出(保持纵横比).
基于grafika中的ContinuousCaptureActivity示例,我认为最好的方法是将摄像机发送到SurfaceTexture并通常渲染输出并将其缩小为a SurfaceView,并在需要时将整个帧渲染为不Surface具有视图的不同帧,以便按顺序排列从常规SurfaceView呈现并行检索字节缓冲区.
该示例与我的情况非常相似 - 预览呈现为较小尺寸的视图,可以通过a以全分辨率进行记录和保存VideoEncoder.
我用VideoEncoder自己的逻辑替换了逻辑,并试图提供Surface像编码器一样的全分辨率渲染.我该如何创建这样的Surface?我接近这个吗?
基于示例的一些代码构思:
在surfaceCreated(SurfaceHolder holder)方法内(第350行):
@Override // SurfaceHolder.Callback
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "surfaceCreated holder=" + holder);
mEglCore = new EglCore(null, EglCore.FLAG_RECORDABLE);
mDisplaySurface = new WindowSurface(mEglCore, holder.getSurface(), false);
mDisplaySurface.makeCurrent();
mFullFrameBlit = new FullFrameRect(
new Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT));
mTextureId = mFullFrameBlit.createTextureObject();
mCameraTexture = new SurfaceTexture(mTextureId);
mCameraTexture.setOnFrameAvailableListener(this);
Log.d(TAG, "starting camera preview"); …Run Code Online (Sandbox Code Playgroud) glsurfaceview ×10
android ×9
opengl-es ×5
surfaceview ×2
android-ndk ×1
c++ ×1
mediacodec ×1
onresume ×1
screenshot ×1
static ×1
touch ×1