具有 Android 上下文的 OpenGL 纹理

OpenGL Texturing with Android Context

我正在尝试创建一个可以为多个立方体制作纹理的程序。我在着色方面很成功,但在纹理方面遇到了一些困难,主要是关于我的 Android Activity。

我不知道如何设置 2 个内容(或者如果可能的话)或如何将 Renderer 设置为我原来的 setContentView(R.layout.activity_my_glsurface_view)

我需要这个以便在我的 GLRenderer 中调用 mCube.loadTexture(this.context, R.drawable.app_icon_your_company) 以将我的纹理应用于我的立方体。我将在下面附上我的代码,如果 Android 中有另一种方法,请告诉我,但我遇到的所有教程都是这样做的,我遇到了同样的问题。

下面是我的主Activity:

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

  }
}

我也会从我的 Cube.java class 中包含我的 loadTexture

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

我错误地调用了 loadTexture,应该在 onSurfaceCreated 中而不是在 onSurfaceChanged 中如下调用:

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

此外,我能够通过我忽略提供的 MyGLSurfaceViewFunction 正确访问上下文,而不是将我的内容视图设置为 mGLView。这使我能够正确纹理。