2016-09-16 93 views
0

我試圖創建一個可以紋理多個多維數據集的程序。我在着色方面很成功,但是面臨着一些貼圖的困難,主要是關於我的Android活動。使用Android上下文的OpenGL紋理

我不知道如何設置2個內容(或者甚至可能)或如何將渲染器設置爲我的原始setContentView(R.layout.activity_my_glsurface_view)

我需要這個以便在我的GLRenderer中調用mCube.loadTexture(this.context, R.drawable.app_icon_your_company)將我的紋理應用到我的立方體。我將在下面附上我的代碼,如果在Android中有另一種方法,請告訴我,但我遇到的所有教程都是這樣做的,而且我面臨同樣的問題。

下面是我的主要活動:

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); 

    } 
} 

我會包括我loadTexture從我Cube.java類以及:

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]; 
} 

回答

0

我被錯誤地呼喚loadTexture,應該已經內onSurfaceCreated如下而不是在onSurfaceChanged上:

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

此外,我能夠通過我忽略提供的MyGLSurfaceViewFunction正確訪問上下文,而不是將我的內容視圖設置爲mGLView。這使我能夠正確地紋理。