Note that there are some explanatory texts on larger screens.

plurals
  1. POIs Opengl Development GPU Dependant?
    primarykey
    data
    text
    <p>I am developing an android application in opengl ES2.0.In this Application I used to draw multiple lines and circles by touch event in GL surfaceView.</p> <p>As opengl depends on GPU, Currently it works fine in Google Nexus 7(ULP GeForce). </p> <p>In Samsung Galaxy Note 2(MALI 400MP) I'm trying to draw more than one line, but it clears the previous line and draw current line as new.</p> <p>In Sony Xperia Neo V(Adreno 205) I'm trying to draw a new line, it crashes the surface as shown in below image.<img src="https://i.stack.imgur.com/XY7dy.jpg" alt="enter image description here"></p> <p>Is it possible to make it work on all devices or do I need to write code for Individual GPU?</p> <hr> <h2>Source code</h2> <h3>MainActivity.java</h3> <pre><code>//in OnCreate method of my activity, i set the glsurfaceview and renderer final ActivityManager activityManager = ( ActivityManager ) getSystemService( Context.ACTIVITY_SERVICE ); final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo( ); final boolean supportsEs2 = ( configurationInfo.reqGlEsVersion &gt;= 0x20000 || Build.FINGERPRINT.startsWith( "generic" ) ); if( supportsEs2 ) { Log.i( "JO", "configurationInfo.reqGlEsVersion:" + configurationInfo.reqGlEsVersion + "supportsEs2:" + supportsEs2 ); // Request an OpenGL ES 2.0 compatible context. myGlsurfaceView.setEGLContextClientVersion( 2 ); final DisplayMetrics displayMetrics = new DisplayMetrics( ); getWindowManager( ).getDefaultDisplay( ).getMetrics( displayMetrics ); // Set the renderer to our demo renderer, defined below. myRenderer = new MyRenderer( this, myGlsurfaceView ); myGlsurfaceView.setRenderer( myRenderer, displayMetrics.density ); myGlsurfaceView.setRenderMode( GLSurfaceView.RENDERMODE_CONTINUOUSLY ); MyGLSurfaceView.java //in this im getting the coordinates of my touch on the glSurfaceView to draw the line and //passing those points to the renderer class public MyGLsurfaceview( Context context ) { super( context ); Log.i( "JO", "MyGLsurfaceview1" ); } public MyGLsurfaceview( Context context, AttributeSet attrs ) { super( context, attrs ); con = context; mActivity = new MainActivity( ); mActivity.myGlsurfaceView = this; Log.i( "JO", "MyGLsurfaceview2" ); } public void setRenderer( MyRenderer renderer, float density ) { Log.i( "JO", "setRenderer" ); myRenderer = renderer; myDensity = density; mGestureDetector = new GestureDetector( con, mGestureListener ); super.setRenderer( renderer ); setRenderMode( GLSurfaceView.RENDERMODE_CONTINUOUSLY ); } @Override public boolean onTouchEvent( MotionEvent ev ) { boolean retVal = mGestureDetector.onTouchEvent( ev ); if( myline ) { switch ( ev.getAction( ) ) { case MotionEvent.ACTION_DOWN: isLUp = false; if( count == 1 ) { dx = ev.getX( ); dy = ev.getY( ); dx = ( dx / ( getWidth( ) / 2 ) ) - 1; dy = 1 - ( dy / ( getHeight( ) / 2 ) ); firstX = dx; firstY = dy; } else if( count == 2 ) { ux = ev.getX( ); uy = ev.getY( ); ux = ( ux / ( getWidth( ) / 2 ) ) - 1; uy = 1 - ( uy / ( getHeight( ) / 2 ) ); secondX = ux; secondY = uy; myRenderer.dx = firstX; myRenderer.dy = firstY; myRenderer.ux = secondX; myRenderer.uy = secondY; midX = ( firstX + secondX ) / 2; midY = ( firstY + secondY ) / 2; Log.e( "JO", "Line:firstX" + firstX + "firstY" + firstY ); lp = new LinePoints( firstX, firstY, secondX, secondY, midX, midY ); lineArray.add( lp ); myRenderer.isNewClick = false; myRenderer.isEnteredAngle = false; myRenderer.myline = true; myRenderer.mycircle = false; myRenderer.mydashedline = false; myRenderer.eraseCircle = false; myRenderer.eraseLine = false; myRenderer.eraseSelCir = false; myRenderer.angle = angle; myRenderer.length = length; requestRender( ); count = 0; } count++; break; case MotionEvent.ACTION_MOVE: isLUp = true; break; case MotionEvent.ACTION_UP: if( isLUp ) { ux = ev.getX( ); uy = ev.getY( ); ux = ( ux / ( getWidth( ) / 2 ) ) - 1; uy = 1 - ( uy / ( getHeight( ) / 2 ) ); Log.i( "JO", "line2:" + ux + "," + uy ); secondX = ux; secondY = uy; myRenderer.dx = firstX; myRenderer.dy = firstY; myRenderer.ux = secondX; myRenderer.uy = secondY; midX = ( firstX + secondX ) / 2; midY = ( firstY + secondY ) / 2; Log.e( "JO", "Line:firstX" + firstX + "firstY" + firstY ); lp = new LinePoints( firstX, firstY, secondX, secondY, midX, midY ); lineArray.add( lp ); myRenderer.isNewClick = false; myRenderer.isEnteredAngle = false; myRenderer.myline = true; myRenderer.mycircle = false; myRenderer.mydashedline = false; myRenderer.mysnaptoedge = false; myRenderer.mysnaptoMiddle = false; myRenderer.eraseCircle = false; myRenderer.eraseLine = false; myRenderer.eraseSelCir = false; count = 1; requestRender( ); } break; } } } } </code></pre> <h3>MyRenderer.java</h3> <pre><code>//renderer class to render the line to the glsurfaceview Lines line; public MyRenderer( MainActivity mainActivity, MyGLsurfaceview myGlsurfaceView ) { Log.i( "JO", "MyRenderer" ); this.main = mainActivity; myGlsurface = myGlsurfaceView; } public void onDrawFrame( GL10 gl ) { line.draw( dx, dy, ux, uy ); } @Override public void onSurfaceCreated( GL10 gl, EGLConfig config ) { Log.i( "JO", "onSurfaceCreated" ); // Set the background frame color GLES20.glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); // Create the GLText glText = new GLText( main.getAssets( ) ); // Load the font from file (set size + padding), creates the texture // NOTE: after a successful call to this the font is ready for // rendering! glText.load( "Roboto-Regular.ttf", 14, 2, 2 ); // Create Font (Height: 14 // Pixels / X+Y Padding // 2 Pixels) // enable texture + alpha blending GLES20.glEnable( GLES20.GL_BLEND ); GLES20.glBlendFunc( GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA ); } @Override public void onSurfaceChanged( GL10 gl, int width, int height ) { // Adjust the viewport based on geometry changes, // such as screen rotation GLES20.glViewport( 0, 0, width, height ); ratio = ( float ) width / height; width_surface = width; height_surface = height; /* * // this projection matrix is applied to object coordinates // in the * onDrawFrame() method Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, * -1, 1, 3, 7); */ // Take into account device orientation if( width &gt; height ) { Matrix.frustumM( mProjMatrix, 0, -ratio, ratio, -1, 1, 1, 10 ); } else { Matrix.frustumM( mProjMatrix, 0, -1, 1, -1 / ratio, 1 / ratio, 1, 10 ); } // Save width and height this.width = width; // Save Current Width this.height = height; // Save Current Height int useForOrtho = Math.min( width, height ); // TODO: Is this wrong? Matrix.orthoM( mVMatrix, 0, -useForOrtho / 2, useForOrtho / 2, -useForOrtho / 2, useForOrtho / 2, 0.1f, 100f ); } </code></pre> <h3>Line.java</h3> <pre><code>//Line class to draw line public class Lines { final String vertexShaderCode = "attribute vec4 vPosition;" + "void main() {" + " gl_Position = vPosition;" + "}"; final String fragmentShaderCode = "precision mediump float;" + "uniform vec4 vColor;" + "void main() {" + " gl_FragColor = vColor;" + "}"; final FloatBuffer vertexBuffer; final int mProgram; int mPositionHandle; int mColorHandle; // number of coordinates per vertex in this array final int COORDS_PER_VERTEX = 3; float lineCoords[] = new float[6]; final int vertexCount = lineCoords.length / COORDS_PER_VERTEX; final int vertexStride = COORDS_PER_VERTEX * 4; // bytes per vertex // Set color with red, green, blue and alpha (opacity) values float lcolor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; public Lines( ) { // initialize vertex byte buffer for shape coordinates ByteBuffer bb = ByteBuffer.allocateDirect( // (number of coordinate values * 4 bytes per float) lineCoords. length * 4 ); // use the device hardware's native byte order bb.order( ByteOrder.nativeOrder( ) ); // create a floating point buffer from the ByteBuffer vertexBuffer = bb.asFloatBuffer( ); // prepare shaders and OpenGL program int vertexShader = MyRenderer.loadShader( GLES20.GL_VERTEX_SHADER, vertexShaderCode ); int fragmentShader = MyRenderer.loadShader( GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode ); mProgram = GLES20.glCreateProgram( ); // create empty OpenGL Program GLES20.glAttachShader( mProgram, vertexShader ); // add the vertex shader // to program GLES20.glAttachShader( mProgram, fragmentShader ); // add the fragment // shader to program GLES20.glLinkProgram( mProgram ); // create OpenGL program executables } public void draw( float dX, float dY, float uX, float uY ) { lineCoords[0] = dX; lineCoords[1] = dY; lineCoords[2] = 0.0f; lineCoords[3] = uX; lineCoords[4] = uY; lineCoords[5] = 0.0f; Log.i( "JO", "lineCoords:" + lineCoords[0] + "," + lineCoords[1] + "," + lineCoords[3] + "," + lineCoords[4] ); vertexBuffer.put( lineCoords ); vertexBuffer.position( 0 ); // Add program to OpenGL environment GLES20.glUseProgram( mProgram ); // get handle to vertex shader's vPosition member mPositionHandle = GLES20.glGetAttribLocation( mProgram, "vPosition" ); // Enable a handle to the triangle vertices GLES20.glEnableVertexAttribArray( mPositionHandle ); // Prepare the triangle coordinate data GLES20.glVertexAttribPointer( mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer ); // get handle to fragment shader's vColor member mColorHandle = GLES20.glGetUniformLocation( mProgram, "vColor" ); // Set color for drawing the triangle GLES20.glUniform4fv( mColorHandle, 1, lcolor, 0 ); GLES20.glLineWidth( 3 ); // Draw the triangle GLES20.glDrawArrays( GLES20.GL_LINES, 0, vertexCount ); // Disable vertex array GLES20.glDisableVertexAttribArray( mPositionHandle ); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload