2016-09-16 3 views
0

Ich versuche, ein Programm zu erstellen, das mehrere Cubes texturieren kann. Ich bin beim Färben erfolgreich gewesen, aber ich stehe vor einigen Schwierigkeiten beim Strukturieren, hauptsächlich in Bezug auf meine Android-Aktivität.OpenGL Texturing mit Android Kontext

Ich weiß nicht, wie man 2 Inhalte setzt (oder wenn das überhaupt möglich ist) oder wie ich den Renderer auf mein Original setze setContentView(R.layout.activity_my_glsurface_view).

Ich brauche das, um mCube.loadTexture(this.context, R.drawable.app_icon_your_company) in meinem GLRenderer aufzurufen, um meine Textur auf meinen Würfel anzuwenden. Ich füge meinen Code unten an, wenn es eine andere Möglichkeit gibt, dies in Android zu tun, lassen Sie es mich bitte wissen, aber alle Tutorials, auf die ich gestoßen bin, tun es auf diese Art und ich stehe vor dem gleichen Problem.

Unten ist mein Hauptaktivität:

public class MainActivity extends Activity implements OnClickListener{ 

int TriData = (Triangle.triangleCoords.length)/Triangle.COORDS_PER_VERTEX; 
int SquData = (Square.squareCoords.length)/Square.COORDS_PER_VERTEX; 
int CubeData = Cube.COORDS_PER_VERTEX * 4; 
int amount = CubeData; 

private GLSurfaceView mGLView; 
private TextView mText; 
private Button mBTN; 




     @Override 
     public void onCreate (Bundle savedInstanceState){ 
      super.onCreate(savedInstanceState); 

      // Create a GLSurfaceView instance and set it-altered glsurfaceview to contain GL elements 
      // as the ContentView for this Activity. 
      // mGLView = new MyGLSurfaceView(this); 
      setContentView(R.layout.activity_my_glsurface_view); 

      FrameLayout surface = (FrameLayout) findViewById(R.id.middleSurface); 
      surface.addView(new MyGLSurfaceView(this)); 

      mGLView = new GLSurfaceView(this); //this is where my error occurs 
      mGLView.setRenderer(new MyGLRenderer(this)); 
      setContentView(mGLView); 

      mBTN = (Button) findViewById(R.id.MyButton); 
      mBTN.setOnClickListener(MainActivity.this); 



      mText = (TextView) findViewById(R.id.MyGl); 
      mText.setText("Vertices drawn: " + amount + "\r\n" + "FPS: " + MyGLRenderer.FPS + "\r\n" + "Frametime: " + MyGLRenderer.FRAME_TIME_MILLIS + "\r\n" + "Cube Total: "); 


     } 

@Override 
public void onClick(View v) { 
    Intent push = new Intent(MainActivity.this, Test.class); 
    //where the 2nd in this case is the class you want to run. 

    startActivity(push); 

    } 
} 

Ich werde mein loadTexture von meiner Cube.java Klasse gehören auch:

public int loadTexture(final Context context, final int resourceId) { 
    //Get the texture from the Android resource directory 
    final int[] textureHandle = new int[1]; 
    InputStream is = context.getResources().openRawResource(+ R.drawable.app_icon_your_company); 
    Bitmap bitmap = null; 
    try { 
     //BitmapFactory is an Android graphics utility for images 
     bitmap = BitmapFactory.decodeStream(is); 

    } finally { 
     //Always clear and close 
     try { 
      is.close(); 
      is = null; 
     } catch (IOException e) { 
     } 
    } 

    //Generate one texture pointer... 
    GLES20.glGenTextures(1, textureHandle, 0); 
    //...and bind it to our array 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); 

    //Create Nearest Filtered Texture 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

    //Accounting for different texture parameters 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 

    //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 

    //Clean up 
    bitmap.recycle(); 


    if (textureHandle[0] == 0) 

    { 
     throw new RuntimeException("Error loading texture"); 
    } 

    return textureHandle[0]; 
} 

Antwort

0

Ich rief Loadtexture falsch und wurde innerhalb onSurfaceCreated wie folgt sein sollte anstatt in onSurfaceChanged:

TexturedCube.mTextureDataHandle = TexturedCube.loadTexture(context, R.drawable.app_icon_your_company); 

Außerdem konnte ich über meine MyGLSurfaceViewFunction, die ich nicht zur Verfügung gestellt hatte, auf den Kontext zugreifen, anstatt meine Inhaltsansicht auf mGLView zu setzen. Dadurch konnte ich richtig texturieren.