0

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

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

我需要这个来调用mCube.loadTexture(this.context, R.drawable.app_icon_your_company)GLRenderer将我的纹理应用到我的立方体。我将在下面附上我的代码,如果在 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);

  }
}

我也会包括我loadTextureCube.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];
}
4

1 回答 1

0

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

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

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

于 2016-09-19T16:34:19.563 回答