我正在尝试创建一个程序,可以纹理多个立方体。我在着色方面很成功,但在纹理方面遇到了一些困难,主要是关于我的Android Activity。
我不知道如何设置2个内容(或者如果这甚至是可能的)或如何设置Renderer到我原来的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 + "rn" + "FPS: " + MyGLRenderer.FPS + "rn" + "Frametime: " + MyGLRenderer.FRAME_TIME_MILLIS + "rn" + "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
类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。