Android中GLSurfaceView和SurfaceView重叠显示? 2C

将GLSurfaceView和SurfaceView放在一个FrameLayout中,GLSurfaceView在

SurfaceView之上,都设置了setZOrderOnTop(true);在第一次显示时
GLSurfaceView显示在SurfaceView之上,但按home键后,再点击该程序,

SurfaceView就一直显示在GLSurfaceView之上了。
请问下是什么原因?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
OpenGl SE GlsurfaceView surfaceView使用Camera预览显示问题
如题,我在使用FrameLayout布局时,将GlsurfaceView放置在顶层,也设置了setZOrderOnTop(true);和setEGLConfigChooser(8, 8, 8, 8, 16, 0);setFormat(PixelFormat.TRANSLUCENT);然后在渲染颜色立方体的时候能够实现照相机预览和立方体的同时显示,但是换了一个渲染图形之后,比如正四面体,求解释这是怎么回事啊???
OpenGL ES3.0纹理贴图问题,贴图发生错误,无法显示贴图细节是怎么回事啊?
最近在学习OpenGL ES,按照书上教程尝试写了个demo,然后发现在纹理贴图这块遇到问题了,求助各位大佬 程序思路很简单,画5个点然后贴上纹理,但是纹理总是出现错误,下面是截图: ![图片说明](https://img-ask.csdn.net/upload/202002/12/1581502455_517510.jpg) 这个是要贴的纹理,大小为512 \*1024,另外正方形纹理我也试过同样不行 ![图片说明](https://img-ask.csdn.net/upload/202002/12/1581502536_603856.png) 接下来是代码: 首先是Render: ```java package com.example.firstopengl; import android.content.Context; import android.opengl.GLES30; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import com.airhockey.android.objects.Mallet; import com.airhockey.android.objects.Table; import com.airhockey.android.programs.ColorShaderProgram; import com.airhockey.android.programs.TextureShaderProgram; import com.airhockey.android.util.MatrixHelper; import com.airhockey.android.util.TextureHelper; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class AirHockeyRender implements GLSurfaceView.Renderer { private final String TAG = "AirHockeyRender"; private final Context context; private final float[] projectionMatrix = new float[16]; private final float[] modelMatrix = new float[16]; private Table table; private Mallet mallet; private TextureShaderProgram textureShaderProgram; private ColorShaderProgram colorShaderProgram; private int texture; public AirHockeyRender(Context context){ this.context = context; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); table = new Table(); mallet = new Mallet(); textureShaderProgram = new TextureShaderProgram(context); colorShaderProgram = new ColorShaderProgram(context); texture = TextureHelper.loadTexture(context, R.drawable.air_hockey_surface); } @Override public void onDrawFrame(GL10 gl) { GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); textureShaderProgram.useProgram(); textureShaderProgram.setUniforms(projectionMatrix, texture); table.bindData(textureShaderProgram); table.draw(); colorShaderProgram.useProgram(); colorShaderProgram.setUniform(projectionMatrix); mallet.bindData(colorShaderProgram); mallet.draw(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { final float[] temp = new float[16]; //设置视口 GLES30.glViewport(0, 0, width, height); MatrixHelper.perspectiveM(projectionMatrix, 45, (float)width/(float)height, 1f, 10f); Matrix.setIdentityM(modelMatrix, 0); Matrix.translateM(modelMatrix, 0, 0f, 0f, -3.1f); Matrix.rotateM(modelMatrix, 0, -60f, 1f, 0f, 0f); Matrix.multiplyMM(temp, 0 ,projectionMatrix, 0, modelMatrix, 0); System.arraycopy(temp, 0, projectionMatrix, 0, temp.length); } } ``` 接下来是纹理生成相关 ``` package com.airhockey.android.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLES30; import android.opengl.GLUtils; import android.util.Log; import com.airhockey.android.Constants; import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class TextureHelper { private final static String TAG = "TextureHelper"; public static int loadTexture(Context context, int resourceId){ final int[] textureObject = new int[1]; GLES30.glGenTextures(1, textureObject, 0); if(textureObject[0]==0){ if(LoggerConfig.ON){ Log.w(TAG, "Could not generate a new OpenGL texture object"); } return 0; } final BitmapFactory.Options options = new BitmapFactory.Options(); //需要原始的图像数据,而不是缩放的版本 options.inScaled = false; //将图像转换为位图 final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options); if(bitmap==null){ if(LoggerConfig.ON){ Log.w(TAG, "Resource ID"+resourceId+"could not be decoded"); } GLES30.glDeleteTextures(1, textureObject, 0); return 0; } //告诉opengl纹理调用使用此纹理 GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureObject[0]); GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR); GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR); GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_REPEAT); GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_REPEAT); //将位图加载至opengl中 GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); //加载后释放位图,解除绑定 bitmap.recycle(); //生成mip贴图 GLES30.glGenerateMipmap(GLES30.GL_TEXTURE_2D); GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0); return textureObject[0]; } } ``` 然后是画的物体: ``` package com.airhockey.android.objects; import android.opengl.GLES30; import com.airhockey.android.Constants; import com.airhockey.android.data.VertexArray; import com.airhockey.android.programs.TextureShaderProgram; public class Table { private static final int POSITION_COMPONENT_COUNT = 2; private static final int TEXTURE_COORDINATES_COMPONENT_COUNT = 2; private static final int STRIDE = (POSITION_COMPONENT_COUNT+TEXTURE_COORDINATES_COMPONENT_COUNT) * Constants.BYTE_PER_FLOAT; private final VertexArray vertexArray; private static final float[] VERTEX_DATA = { //x,y,s,t //三角扇区 0f, 0f, 0.5f, 0.5f, -0.5f, -0.8f, 0.0f, 1.0f, 0.5f, -0.8f, 1.0f, 1.0f, 0.5f, 0.8f, 1.0f, 0.0f, -0.5f, 0.8f, 0.0f, 0.0f, -0.5f, -0.8f, 0.0f, 1.0f // -0.5f, -0.8f, 0f, 1f, // -0.5f, 0.8f, 0f, 0f, // 0.5f, -0.8f, 1f, 1f, // // -0.5f, 0.8f, 0f, 0f, // 0.5f, -0.8f, 1f, 1f, // 0.5f, 0.8f, 1f, 0f }; public Table(){ vertexArray = new VertexArray(VERTEX_DATA); } public void bindData(TextureShaderProgram textureProgram){ vertexArray.setVertexAttribPointer(0, textureProgram.getPositonAttributeLocation(), POSITION_COMPONENT_COUNT, STRIDE); vertexArray.setVertexAttribPointer(POSITION_COMPONENT_COUNT, textureProgram.getTextureCoordinatesAttributeLocation(), TEXTURE_COORDINATES_COMPONENT_COUNT, STRIDE); } public void draw(){ GLES30.glDrawArrays(GLES30.GL_TRIANGLE_FAN, 0, 6); } } ``` 头真的大,研究了好久都没研究出来怎么回事
glsurfaceview 在设置setZOrderOnTop();为true的时候,遮挡view
自定义glsurfaceview的时候,当设置其背景透明的时候,需要使用setZOrderOnTop()这个方法 如果设置了这个方法,glsurfaceview会置顶到window的最上层,那么会遮挡其它view 问题:如果解决即让glsurfaceview背景透明,也不会遮挡view的情况呢
Android想将图片间隔改一下,以为很简单弄了一天,求思路
![图片说明](https://img-ask.csdn.net/upload/201709/26/1506359899_11872.jpg) 请GitHub搜“EhViewer”,提问秒删不知道是不是不能发地址 - 漫画app,登录时请点击最下面的“免登陆”,入口选择第一个"e-hexxai"。 - 现在只想改一个地方,就是看漫画两页之间的黑条去掉,形成无缝连接。为了这一个小改动,从昨晚搞到现在,android学得稀烂,基础较薄弱,很久没敲代码了,现在都不知道这个黑条间隔到底是在哪个位置添加的,求思路 - 首先,我用ddms看了下,发现整个图片内容显示都是一个自定义view - 找到布局文件activity gallery.xml中发现是一个命名GLRootView的自定义控件 - 因为不同页及黑条都在同一个控件内,所以应该不是activity中代码实现,直接定位到GLRootView,继承自GLSurfaceView - 看了下构造函数,里面有一些方法看不懂,搜了下都是surfaceview相关,而GLSurfaceView就继承的surfaceview - 然后顺着GLSurfaceView的构造找下去,发现就一个初始化方法里面有个SurfaceHolder的回调,简单研究了下serfaceview,没搞懂 然后我该怎么办? 回过头去,我以为漫画应该是recylerview或listview展示的,发现GLRootView和GLSurfaceView的java文件中都没有写入布局相关的代码, 我该怎么定位到那个给两页漫画间增加间隔的代码中去?求具体的思路
怎样将opengl的GLSurfaceView显示在另一个view上呢?
怎样将opengl的GLSurfaceView显示在另一个view上呢?
android OPENGLES 截屏显示问题
先上代码 public class MainActivity extends AppCompatActivity implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { private MediaProjectionManager mediaProjectionManager; private GLSurfaceView surfaceview; private LinearLayout linearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); linearLayout = ((LinearLayout) findViewById(R.id.linearlayout)); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } /** * 初始化摄像头 */ private void initCamera() { surfaceview = new GLSurfaceView(this); linearLayout.addView(surfaceview); surfaceview.setEGLContextClientVersion(2); surfaceview.setRenderer(this); } private MediaProjection mediaProjection; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); initCamera(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { setupGraphics(); setupVertexBuffer(); setupTexture(); // } private int width=1080; private int height=1920; private MediaPlayer mediaPlayer; @Override public void onSurfaceChanged(GL10 gl, int width, int height) { this.width = width; this.height = height; // if (mediaPlayer == null) { // mediaPlayer = new MediaPlayer(); // mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { // @Override // public void onPrepared(MediaPlayer mp) { // mp.start(); // } // }); // Surface surface = new Surface(videoTexture); // mediaPlayer.setSurface(surface); // surface.release(); // try { // mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath()+"/1.mp4"); // mediaPlayer.prepareAsync(); // } catch (IOException e) { // e.printStackTrace(); // } // } else { // mediaPlayer.start(); // } Surface surface = new Surface(videoTexture); VirtualDisplay display = mediaProjection.createVirtualDisplay("aa", 1080, 1920, 32, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null); } private float[] videoTextureTransform = new float[16]; @Override public void onDrawFrame(GL10 gl) { synchronized (this) { if (frameAvailable) { videoTexture.updateTexImage(); videoTexture.getTransformMatrix(videoTextureTransform); frameAvailable = false; } } GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]); // Draw a rectangle and render the video frame as a texture on it. GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); // GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // GLES20.glViewport(0, 0, width, height); this.drawTexture(); } private int shaderProgram; int textureParamHandle; int textureCoordinateHandle; int positionHandle; int textureTranformHandle; private static short drawOrder[] = {0, 1, 2, 0, 2, 3}; private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; private static float squareSize = 0.5f; private static float squareCoords[] = { -squareSize, squareSize, // top left -squareSize, -squareSize, // bottom left squareSize, -squareSize, // bottom right squareSize, squareSize}; // top right private FloatBuffer textureBuffer; private float textureCoords[] = { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}; private int[] textures = new int[1]; private SurfaceTexture videoTexture; private void setupGraphics() { final String vertexShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.vetext_sharder); final String fragmentShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.fragment_sharder); final int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, vertexShader); final int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader); shaderProgram = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, new String[]{"texture", "vPosition", "vTexCoordinate", "textureTransform"}); GLES20.glUseProgram(shaderProgram); textureParamHandle = GLES20.glGetUniformLocation(shaderProgram, "texture"); textureCoordinateHandle = GLES20.glGetAttribLocation(shaderProgram, "vTexCoordinate"); positionHandle = GLES20.glGetAttribLocation(shaderProgram, "vPosition"); textureTranformHandle = GLES20.glGetUniformLocation(shaderProgram, "textureTransform"); } private void setupVertexBuffer() { // Draw list buffer ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(drawOrder); drawListBuffer.position(0); // Initialize the texture holder ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0); } private void setupTexture() { ByteBuffer texturebb = ByteBuffer.allocateDirect(textureCoords.length * 4); texturebb.order(ByteOrder.nativeOrder()); textureBuffer = texturebb.asFloatBuffer(); textureBuffer.put(textureCoords); textureBuffer.position(0); // Generate the actual texture GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glGenTextures(1, textures, 0); // checkGlError("Texture generate"); GLES20.glBindTexture(GLES20.GL_TEXTURE_BINDING_2D, textures[0]); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); // checkGlError("Texture bind"); videoTexture = new SurfaceTexture(textures[0]); videoTexture.setOnFrameAvailableListener(this); } private boolean frameAvailable = false; @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { synchronized (this) { Log.e("---", "onFrameAvailable: "); frameAvailable = true; } } private void drawTexture() { // Draw texture GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, vertexBuffer); GLES20.glEnableVertexAttribArray(textureCoordinateHandle); GLES20.glVertexAttribPointer(textureCoordinateHandle, 4, GLES20.GL_FLOAT, false, 0, textureBuffer); GLES20.glUniformMatrix4fv(textureTranformHandle, 1, false, videoTextureTransform, 0); GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer); } } fragment_shader #extension GL_OES_EGL_image_external : require precision mediump float; uniform samplerExternalOES texture; varying vec2 v_TexCoordinate; void main () { vec4 color = texture2D(texture, v_TexCoordinate); gl_FragColor = color; } vetext_shader attribute vec4 vPosition; attribute vec4 vTexCoordinate; uniform mat4 textureTransform; varying vec2 v_TexCoordinate; void main () { v_TexCoordinate = (textureTransform * vTexCoordinate).xy; gl_Position = vPosition; } 视频可以播放,截屏就无法正常显示了,不知道为何求大神指教![图片说明](https://img-ask.csdn.net/upload/201703/07/1488876551_179145.png)
android 怎么加载3d模型 .DAE文件 或者。max也行
项目中用的GLSurfaceView ,,需要加载一个.max 或者 .dae 格式的 3D模型工具,obj格式的不支持动作, 不知道有没有其他推荐,Android开发
Android 悬浮窗获取点击拖拽事件
之前参照网上例子写过一个demo,实现在Activity中点击最小化按钮,将该Activity finish,并启动servie生成一个悬浮按钮,可点击也可拖拽; 最近工作需要也做一个相似的悬浮窗,悬浮按钮生成了,App被Home也能存在,不会 消失,但该悬浮按钮却没法捕获点击和拖拽事件。 这两个代码几乎一摸一样,请大神们帮忙看下是哪里出的问题,谢谢! 代码如下: package com.example.menqi.myapplication; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; public class MyService extends Service { private WindowManager mWindowManager; private WindowManager.LayoutParams mLayoutParams; /** * float的布局view */ private View mFloatView; private ViewGroup glSurfaceView; private int mFloatWinWidth,mFloatWinHeight;//悬浮窗的宽高 //private int mFloatWinMarginTop,mFloatWinMarginRight; public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { createWindowManager(); createFloatView(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); removeFloatView(); } private void createWindowManager() { // 取得系统窗体 mWindowManager= (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); //计算得出悬浮窗口的宽高 DisplayMetrics metric =new DisplayMetrics(); mWindowManager.getDefaultDisplay().getMetrics(metric); int screenWidth = metric.widthPixels; mFloatWinWidth = screenWidth *1/3; mFloatWinHeight=mFloatWinWidth*4/3; //mFloatWinMarginTop= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_margintop); //mFloatWinMarginRight= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_marginright); // 窗体的布局样式 // 获取LayoutParams对象 mLayoutParams=new WindowManager.LayoutParams(); // 确定爱悬浮窗类型,表示在所有应用程序之上,但在状态栏之下 //TODO? 在android2.3以上可以使用TYPE_TOAST规避权限问题 mLayoutParams.type= WindowManager.LayoutParams.TYPE_TOAST;//TYPE_PHONE mLayoutParams.format= PixelFormat.RGBA_8888; mLayoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; // 悬浮窗的对齐方式 mLayoutParams.gravity= Gravity.LEFT| Gravity.TOP; // 悬浮窗的位置 mLayoutParams.x=70; mLayoutParams.y=210; mLayoutParams.width=mFloatWinWidth; mLayoutParams.height=mFloatWinHeight; } //开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标) private int mTouchStartX, mTouchStartY, mTouchCurrentX, mTouchCurrentY; //开始时的坐标和结束时的坐标(相对于自身控件的坐标) private int mStartX, mStartY, mStopX, mStopY; //判断悬浮窗口是否移动,这里做个标记,防止移动后松手触发了点击事件 private boolean isMove; /** * 创建悬浮窗 */ private void createFloatView() { LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); mFloatView= inflater.inflate(R.layout.floatlayout, null); glSurfaceView= (ViewGroup)mFloatView.findViewById(R.id.VOIPFloatView); //glSurfaceView.setPreserveEGLContextOnPause(true); glSurfaceView.setKeepScreenOn(true); mWindowManager.addView(mFloatView,mLayoutParams); mFloatView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v,MotionEvent event) { int action = event.getAction(); /*if(MotionEvent.ACTION_DOWN == action) { mStartX=mLastX= (int) event.getRawX(); mStartY=mLastY= (int) event.getRawY(); }else if(MotionEvent.ACTION_UP == action) { int dx = (int) event.getRawX() -mStartX; int dy = (int) event.getRawY() -mStartY; if(Math.abs(dx) >5|| Math.abs(dy) >5) { return true; } }else if(MotionEvent.ACTION_MOVE == action) { int dx = (int) event.getRawX() -mLastX; int dy = (int) event.getRawY() -mLastY; mLayoutParams.x=mLayoutParams.x- dx; mLayoutParams.y=mLayoutParams.y+ dy; mWindowManager.updateViewLayout(mFloatView,mLayoutParams); mLastX= (int) event.getRawX(); mLastY= (int) event.getRawY(); } return false;*/ switch (action) { case MotionEvent.ACTION_DOWN: isMove = false; mTouchStartX = (int) event.getRawX(); mTouchStartY = (int) event.getRawY(); mStartX = (int) event.getX(); mStartY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: mTouchCurrentX = (int) event.getRawX(); mTouchCurrentY = (int) event.getRawY(); mLayoutParams.x += mTouchCurrentX - mTouchStartX; mLayoutParams.y += mTouchCurrentY - mTouchStartY; mWindowManager.updateViewLayout(mFloatView, mLayoutParams); mTouchStartX = mTouchCurrentX; mTouchStartY = mTouchCurrentY; break; case MotionEvent.ACTION_UP: mStopX = (int) event.getX(); mStopY = (int) event.getY(); if (Math.abs(mStartX - mStopX) >= 1 || Math.abs(mStartY - mStopY) >= 1) { isMove = true; } break; } //如果是移动事件不触发OnClick事件,防止移动的时候一放手形成点击事件 return isMove; } }); mFloatView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToVOIPActivity(); MyService.this.stopSelf(); } }); /*VideoRendererGui.setView(glSurfaceView, new Runnable() { @Override public void run() { if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) { WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.latestLocalVideoSize,WebRtcHelperEx.latestRemoteVideoSize); } } }); if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) { LogEx.d(TAG,"createFloatView: webrtc instance is alive and we will call resetRenders"); WebRtcHelperEx.getInstance().resetRenders(); WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.VIDEOSIZE_SMALL,WebRtcHelperEx.VIDEOSIZE_BIG); }*/ } private void removeFloatView() { if(mFloatView != null && mWindowManager != null) { mWindowManager.removeView(mFloatView); } } /** * 单击后回到@WebRTCActivity以切换为大尺寸页面 */ private void ToVOIPActivity() { //TODO跳转到Activity Intent intentToActivity = new Intent(this, Main2Activity.class);//WebPhoneIncomingCallActivity来电页面 intentToActivity.setFlags(FLAG_ACTIVITY_NEW_TASK); startActivity(intentToActivity); } } layout <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/VOIPFloatView" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/avcallfloat" android:scaleType="centerInside" /> </FrameLayout> </RelativeLayout> </RelativeLayout>
android 使用 opengl 2.0 显示一张静态背景图片,效果显示出来的很奇怪
背景原图是: ![图片说明](https://img-ask.csdn.net/upload/201508/15/1439633444_381670.jpg) 显示的效果却是: ![图片说明](https://img-ask.csdn.net/upload/201508/15/1439633465_796588.png) 我不知道我的代码错在哪了。请有OpenGL开发经验的兄弟帮忙下。我的代码如下: ``` public class BackgroundGLRnder implements GLSurfaceView.Renderer { // Our matrices private final float[] mtrxProjection = new float[16]; private final float[] mtrxView = new float[16]; private final float[] mtrxProjectionAndView = new float[16]; // Geometric variables private float vertices[]; private static float uvs[] = new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; private static short indices[] = new short[]{ 0, 1, 2, 0, 2, 3}; private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; private FloatBuffer uvBuffer; // Our screenresolution private float mScreenWidth = 0; private float mScreenHeight = 0; // Misc private Context mContext; private int mProgramHandle; private int mTextureDataHandle0; /** This will be used to pass in the transformation matrix. */ private int mMVPMatrixHandle; /** This will be used to pass in the texture. */ private int mTextureUniformHandle0; /** This will be used to pass in model position information. */ private int mPositionHandle; /** This will be used to pass in model color information. */ // private int mColorHandle; /** This will be used to pass in model texture coordinate information. */ private int mTextureCoordinateHandle; public BackgroundGLRnder(Context c) { mContext = c; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { SetupImage(); // Set the clear color to black GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1); final String vertexShader = getVertexShader(); final String fragmentShader = getFragmentShader(); final int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, vertexShader); final int fragmentShaderHandle = ShaderHelper.compileShader( GLES20.GL_FRAGMENT_SHADER, fragmentShader); mProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, new String[] { "a_Position", "a_TexCoordinate" }); // Set our per-vertex lighting program. GLES20.glUseProgram(mProgramHandle); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { mScreenWidth = width; mScreenHeight = height; // Redo the Viewport, making it fullscreen. GLES20.glViewport(0, 0, (int) mScreenWidth, (int) mScreenHeight); // Clear our matrices for(int i=0;i<16;i++) { mtrxProjection[i] = 0.0f; mtrxView[i] = 0.0f; mtrxProjectionAndView[i] = 0.0f; } // Setup our screen width and height for normal sprite translation. Matrix.orthoM(mtrxProjection, 0, 0f, mScreenWidth, 0.0f, mScreenHeight, -1, 1); } @Override public void onDrawFrame(GL10 gl) { // Set program handles for cube drawing. mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix"); mTextureUniformHandle0 = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture"); mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate"); // clear Screen and Depth Buffer, // we have set the clear color as black. GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); GLES20.glEnableVertexAttribArray(mPositionHandle); GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer); GLES20.glVertexAttribPointer(mTextureCoordinateHandle, 3, GLES20.GL_FLOAT, false, 0, uvBuffer); // Apply the projection and view transformation GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mtrxProjection, 0); /** * First texture map */ // Set the active texture0 unit to texture unit 0. GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // Bind the texture to this unit. GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle0); // Set the sampler texture unit to 0, where we have saved the texture. GLES20.glUniform1i(mTextureUniformHandle0, 0); // Draw the triangle GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer); // Disable vertex array GLES20.glDisableVertexAttribArray(mPositionHandle); GLES20.glDisableVertexAttribArray(mTextureCoordinateHandle); } private String getVertexShader() { return RawResourceReader.readTextFileFromRawResource(mContext, R.raw ._vertex_shader); } private String getFragmentShader() { return RawResourceReader.readTextFileFromRawResource(mContext, R.raw._fragment_shader); } private void constructVertex(){ float with = getScreenWidth(); float heigh = getScreenHeight(); vertices = new float[]{ 0.0f,0.0f,-1.0f, with,0.0f,-1.0f, with,heigh,-1.0f, 0.0f,heigh,-1.0f }; } public void SetupImage() { constructVertex(); // The vertex buffer. ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); // initialize byte buffer for the draw list ByteBuffer dlb = ByteBuffer.allocateDirect(indices.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(indices); drawListBuffer.position(0); // The texture buffer ByteBuffer uvsbb = ByteBuffer.allocateDirect(uvs.length * 4); uvsbb.order(ByteOrder.nativeOrder()); uvBuffer = uvsbb.asFloatBuffer(); uvBuffer.put(uvs); uvBuffer.position(0); // Load the texture mTextureDataHandle0 = TextureHelper.loadTexture(mContext, R.raw.bg_fine_day); // mTextureDataHandle0 = TextureHelper.loadTexture(mContext.getResources().openRawResource // (R.raw.bg_fine_day));x } private int getScreenWidth() { WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); @SuppressWarnings("deprecation") int width = wm.getDefaultDisplay().getWidth();// 屏幕宽度 return width; } private int getScreenHeight() { WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); @SuppressWarnings("deprecation") int height = wm.getDefaultDisplay().getHeight();// 屏幕高度 return height; } ```
cocos2dx游戏安卓接入支付,出现OpenGL无context错误
如题,接入支付后,支付完成后按home键,再返回游戏,游戏崩溃,log表示如下 ``` 04-27 09:29:32.000: E/libEGL(1721): eglMakeCurrent:684 error 3009 (EGL_BAD_MATCH) 04-27 09:29:32.000: E/libEGL(1721): call to OpenGL ES API with no current context (logged once per thread) 04-27 09:29:32.010: W/dalvikvm(1721): threadid=11: thread exiting with uncaught exception (group=0x40c1a1f8) 04-27 09:29:32.020: E/AndroidRuntime(1721): FATAL EXCEPTION: GLThread 909 04-27 09:29:32.020: E/AndroidRuntime(1721): java.lang.RuntimeException: eglSwapBuffers failed: EGL_BAD_SURFACE 04-27 09:29:32.020: E/AndroidRuntime(1721): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1178) 04-27 09:29:32.020: E/AndroidRuntime(1721): at android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1136) 04-27 09:29:32.020: E/AndroidRuntime(1721): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1463) 04-27 09:29:32.020: E/AndroidRuntime(1721): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216) ``` 求遇到此类问题的技术童鞋帮助
GLSurfaceview切换至后台再切换到前台后,所有界面都变成黑色了。
``` relativeLayout = findView(R.id.view_center_earth); surface = new RajawaliSurfaceView(getActivity()); int withAndheigt = DensityUtil.dip2px(200); surface.setLayoutParams(new RelativeLayout.LayoutParams(withAndheigt, withAndheigt)); surface.setFrameRate(40.0); //被动渲染,只有在调用requestRender或者onResume等方法时才会进行渲染。 surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY); renderer = new Renderer(getActivity()); surface.setSurfaceRenderer(renderer); surface.setZOrderOnTop(true); surface.getHolder().setFormat(PixelFormat.TRANSPARENT); relativeLayout.addView(surface); ``` 我用GlSurfaceview在fragment中渲染了一个旋转的3D地球,来回切换fragment页面的控件会重合模糊,前后台切换之后会黑屏,这个问题在4.4以下会出现,7.0的手机都不会出现。希望哪位大神可以帮忙解答一下。谢谢阅读。 ![![图片说明](https://img-ask.csdn.net/upload/201809/17/1537177223_991068.jpg) ![![图片说明](https://img-ask.csdn.net/upload/201809/17/1537177166_510049.jpg)
MediaPlayer.prepareAsync()出现IllegalStateException
05-17 15:58:58.692 14310-14819/com.example.administrator.zd_3d_rebuildofmyself E/AndroidRuntime: FATAL EXCEPTION: GLThread 648 Process: com.example.administrator.zd_3d_rebuildofmyself, PID: 14310 java.lang.IllegalStateException at android.media.MediaPlayer.prepareAsync(Native Method) at com.example.administrator.zd_3d_rebuildofmyself.utils.Movie$5.created(Movie.java:193) at com.wztech.wzplayer.a.ad.onSurfaceCreated(Unknown Source) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1548) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1286) 错误代码 videoSurfaceVideo.setBase(new SurfaceCreatedCallback() { public void created() { Surface s = new Surface(videoSurfaceVideo.getSurfaceTexture()); mediaPlayer.setSurface(s); s.release(); if (list.size() >= 0) { mediaPlayer.prepareAsync(); }} }, WZConst.RM_3D_L, Weave.INTERLACE);
为什么代码中的GLES20会显示错误
package com.bn.Sample9_1; import android.opengl.GLSurfaceView; import android.opengl.GLES20; import android.view.MotionEvent; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; class MySurfaceView extends GLSurfaceView { private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例 private SceneRenderer mRenderer;//场景渲染器 private float mPreviousY;//上次的触控位置Y坐标 private float mPreviousX;//上次的触控位置X坐标 public MySurfaceView(Context context) { super(context); this.setEGLContextClientVersion(2); //设置使用OPENGL ES2.0 mRenderer = new SceneRenderer(); //创建场景渲染器 setRenderer(mRenderer); //设置渲染器 setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染 } //触摸事件回调方法 @Override public boolean onTouchEvent(MotionEvent e) { float y = e.getY(); float x = e.getX(); switch (e.getAction()) { case MotionEvent.ACTION_MOVE: float dy = y - mPreviousY;//计算触控笔Y位移 float dx = x - mPreviousX;//计算触控笔X位移 mRenderer.yAngle += dx * TOUCH_SCALE_FACTOR;//设置绕y轴旋转角度 mRenderer.xAngle+= dy * TOUCH_SCALE_FACTOR;//设置绕x轴旋转角度 requestRender();//重绘画面 } mPreviousY = y;//记录触控笔位置 mPreviousX = x;//记录触控笔位置 return true; } private class SceneRenderer implements GLSurfaceView.Renderer { float yAngle;//绕Y轴旋转的角度 float xAngle; //绕X轴旋转的角度 //从指定的obj文件中加载对象 LoadedObjectVertexOnly lovo; public void onDrawFrame(GL10 gl) { //清除深度缓冲与颜色缓冲 GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); //坐标系推远 MatrixState.pushMatrix(); MatrixState.translate(0, -2f, -25f); //ch.obj //绕Y轴、Z轴旋转 MatrixState.rotate(yAngle, 0, 1, 0); MatrixState.rotate(xAngle, 1, 0, 0); //若加载的物体不为空则绘制物体 if(lovo!=null) { lovo.drawSelf(); } MatrixState.popMatrix(); } public void onSurfaceChanged(GL10 gl, int width, int height) { //设置视窗大小及位置 GLES20.glViewport(0, 0, width, height); //计算GLSurfaceView的宽高比 float ratio = (float) width / height; //调用此方法计算产生透视投影矩阵 MatrixState.setProjectFrustum(-ratio, ratio, -1, 1, 2, 100); //调用此方法产生摄像机9参数位置矩阵 MatrixState.setCamera(0,0,0,0f,0f,-1f,0f,1.0f,0.0f); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { //设置屏幕背景色RGBA GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f); //打开深度检测 GLES20.glEnable(GLES20.GL_DEPTH_TEST); //打开背面剪裁 GLES20.glEnable(GLES20.GL_CULL_FACE); //初始化变换矩阵 MatrixState.setInitStack(); //加载要绘制的物体 lovo=LoadUtil.loadFromFile("ch.obj", MySurfaceView.this.getResources(),MySurfaceView.this); } } }
cocos2dx游戏第二次Home键进入同一场景,openGl错误
游戏进入A场景,home退出返回A场景,正常,再次按home键退出,返回,游戏崩溃,求指导,为什么第二次home键进入会出现此类问题 ``` 04-29 11:53:44.586: V/InputMethodManager(10095): Starting input: Bind result=null 04-29 11:53:44.586: W/IInputConnectionWrapper(10095): showStatusIcon on inactive InputConnection 04-29 11:53:51.616: E/libEGL(10095): eglMakeCurrent:684 error 3009 (EGL_BAD_MATCH) 04-29 11:53:51.616: E/libEGL(10095): call to OpenGL ES API with no current context (logged once per thread) 04-29 11:53:51.636: W/dalvikvm(10095): threadid=11: thread exiting with uncaught exception (group=0x40c101f8) 04-29 11:53:51.646: E/AndroidRuntime(10095): FATAL EXCEPTION: GLThread 699 04-29 11:53:51.646: E/AndroidRuntime(10095): java.lang.RuntimeException: eglSwapBuffers failed: EGL_BAD_SURFACE 04-29 11:53:51.646: E/AndroidRuntime(10095): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1178) 04-29 11:53:51.646: E/AndroidRuntime(10095): at android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1136) 04-29 11:53:51.646: E/AndroidRuntime(10095): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1463) 04-29 11:53:51.646: E/AndroidRuntime(10095): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216) ```
android 将滤镜效果写入视频文件,生成滤镜视频
android 怎样将滤镜数据(如"@beautify bilateral 100 3.5 2 ", "@style crosshatch 0.01 0.003 ",等)写入视频文件,现已实现使用GlsurfaceView播放滤镜效果的视频文件(将滤镜效果在播放视频时加载),但是不知道怎样将滤镜数据写入视频文件,求解答
Android 中使用 GLUtils.texSubImage2D 替换贴图无效
我在GLSurfaceView.Renderer 的onSurfaceCreated生命周期中使用 GLUtils.texSubImage2D有效,替换贴图成功 但是我将这个方法单独写出来,在外部下载新的资源时候单独调用就无效,也不报错 有没有大神来解惑下,急急急
OpenGL 纹理映射无法显示纹理
初学者,希望大侠们能做个解答,小弟在此先行谢过,问题很简单,但我琢磨好久都没搞出来,也找不出问题所在。 想要实现的的功能也很简单,就是纹理。 问题所在:运行之后只有背景,没有纹理 开发环境:Eclipse ADT 源代码: 一、SRC/ SFGame.java package com.gamewenli; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; public class SFGame extends Activity { Renderer render = new SFBameRenderer(this); GLSurfaceView gameView; Button start; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); GLImage.load(this.getResources()); gameView = new GLSurfaceView(this); gameView.setRenderer(render); setContentView(R.layout.pageone); start = (Button) findViewById(R.id.button1); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setContentView(gameView); } }); 二、 SRC/SFBameRenderer.java package com.gamewenli; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLUtils; public class SFBameRenderer implements Renderer { public Context context; private int[] textureids; private FloatBuffer vertexBuffer; private FloatBuffer textureBuffer; //private ByteBuffer indexBuffer; //vertices[]数组会列出一系列的点,其中每一行代表正方形一角的X,Y,Z的值. private float vertices[] ={ 0f, 0f, 0f, 1f, 0f, 0f, 1f, 1f, 0f, 0f, 1f, 0f, }; //texture[]数组表示纹理的四角在何处能与所创建的正方形四角排成一条直线 private float texture[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; //indices[]数组表示正方形表面的定义,正方形的表面被划分为两个三角形,该数组就是逆时针方向上这些三角形的角度数。 //private byte indices[] = { //0, 1, 2, //0, 2, 3 //}; public SFBameRenderer(Context context) { this.context = context; textureids = new int[1]; ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); vertexBuffer = vbb.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); ByteBuffer tbb = ByteBuffer.allocateDirect(texture.length * 4); tbb.order(ByteOrder.nativeOrder()); textureBuffer = tbb.asFloatBuffer(); //indexBuffer = ByteBuffer.allocateDirect(indices.length); //indexBuffer.put(indices); //indexBuffer.position(0); //为正方形贴上纹理 //for (int i = 0; i < 1; i++) { textureBuffer.put(texture); //} textureBuffer.position(0); } @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 开启顶点和纹理功能(开启顶点和纹理缓冲) gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // 设置顶点和纹理 gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer); gl.glTexCoordPointer(3, GL10.GL_FIXED, 0, textureBuffer); // 绘制正方形 //int i = 1; //switch (i) { //case 0: // 生成纹理 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0); // 关闭顶点和纹理功能 gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } //} @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) (width) / height; // 设置OpenGL场景的大小 gl.glViewport(0, 0, width, height); // 设置投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION); // 重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 选择模型观察矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 告诉系统对透视进行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 绿色背景 gl.glClearColor(0, 1, 0, 0); gl.glEnable(GL10.GL_CULL_FACE); // 启用阴影平滑 gl.glShadeModel(GL10.GL_SMOOTH); // 启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); //启用纹理映射 gl.glClearDepthf(1.0f); //深度测试的类型 gl.glDepthFunc(GL10.GL_LEQUAL); // 允许2D贴图,纹理 gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); // 创建纹理 gl.glGenTextures(1, textureids, 0); // 绑定要使用的纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0); // 线性滤波 gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); } } } } class GLImage { public static Bitmap iBitmap; public static Bitmap close_Bitmap; public static void load(Resources resources) { iBitmap = BitmapFactory.decodeResource(resources, R.drawable.wall); } } 三、 RES/Androidmanifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gamewenli" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="SFGame"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
opengl android,为什么我的三角形不显示都是照着写的我的render哪里写错了吗
package com.cheerchip.opengl5; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; /** * Created by noname on 2017/6/28. */ public class GLRender implements GLSurfaceView.Renderer { //顶点颜色 private final String vertexShaderCode = "attribute vec4 vPosition;" + "void main() {" + " gl_Position = vPosition;" + "}"; //片元颜色 private final String fragmentShaderCode = "precision mediump float;" + "uniform vec4 vColor;" + "void main() {" + " gl_FragColor = vColor;" + "}"; private int programs; //三角形顶点 private float[] vertexes = new float[]{ 1f, 0f, 0f, 0f, 1f, 0f, -1f, 0f, 0f }; private FloatBuffer floatBuffer; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES20.glClearColor(0.5f,0.5f,0.5f,1.0f);//设置背景色灰色 init(); //生成shader调色板 //顶点和片元一般两种 int verextype = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); GLES20.glShaderSource(verextype, vertexShaderCode); GLES20.glCompileShader(verextype); int fragmenttype = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); GLES20.glShaderSource(fragmenttype, fragmentShaderCode); GLES20.glCompileShader(fragmenttype); // GLES20. programs = GLES20.glCreateProgram(); //连接到调色板 GLES20.glAttachShader(programs, verextype); GLES20.glAttachShader(programs, fragmenttype); //连接programs GLES20.glLinkProgram(programs); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0,0,width,height); float ratio = (float) width / height; // create a projection matrix from device screen geometry //Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); } @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT); GLES20.glUseProgram(programs); //获取顶点着色器的vPosition成员句柄 int mPositionHandle = GLES20.glGetAttribLocation(programs, "vPositon"); //启用三角形顶点的句柄 GLES20.glEnableVertexAttribArray(mPositionHandle); //准备三角形数据3*4顶点偏移量 GLES20.glVertexAttribPointer(mPositionHandle,3,GLES20.GL_FLOAT,false,3*4,floatBuffer); int uniformhandle= GLES20.glGetUniformLocation(programs,"vColor"); //绘制颜色 GLES20.glUniform4fv(uniformhandle,1,color,0); //h绘制图像 GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,3); GLES20.glDisableVertexAttribArray(mPositionHandle); } //设置颜色,依次为红绿蓝和透明通道 float color[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // 准备数据 private void init(){ ByteBuffer buffer=ByteBuffer.allocateDirect(vertexes.length*4);//每个数4个字节 buffer.order(ByteOrder.nativeOrder()); floatBuffer = buffer.asFloatBuffer(); floatBuffer.put(vertexes); floatBuffer.position(0); } }
mediaplaye.prepareAsync报出IllegalStateException...
异常---- FATAL EXCEPTION: GLThread 1381 Process: com.example.administrator.zd_3d_rebuildofmyself, PID: 5880 java.lang.IllegalStateException at android.media.MediaPlayer.prepareAsync(Native Method) at com.example.administrator.zd_3d_rebuildofmyself.utils.Movie$1.created(Movie.java:150) at com.wztech.wzplayer.a.ad.onSurfaceCreated(Unknown Source) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1548) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1286) 指示的代码 if(list.size()>0){ mediaPlayer = new MediaPlayer(); mediaPlayer.setOnErrorListener(this); mediaPlayer.reset(); Log.d("msg","测试list是不是空:3"); Log.d("msg","list>>>>>>>>"+list.toString()); mediaPlayer.setDataSource(list.get(0).get("Path").toString()); textMovieName.setText(list.get(0).get("Name").toString()); mediaPlayer.setLooping(isLoop); setMediaListener(); videoSurfaceVideo.setBase(new SurfaceCreatedCallback() { public void created() { s = new Surface(videoSurfaceVideo.getSurfaceTexture()); mediaPlayer.setSurface(s); s.release(); // mediaPlayer.prepareAsync();//就是这一行 StopMovie(); StartMovie(); } }, WZConst.RM_3D_L, Weave.INTERLACE); } list已经是证实了不是空的
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问