我刚刚开始学习OpenGL,并开始学习一些基础教程。然而,我尝试创建一个带有纹理的三角形。它看起来像这样
public class demo_Textur extends GameActivity implements GameListener
{
private FloatBuffer vertices;
private FloatBuffer texCoords;
private int texturID;
public void onCreate(Bundle savedInstance)
{
super.onCreate(savedInstance);
setGameListner(this);
}
@Override
public void setup(GameActivity activity, GL10 gl)
{
ByteBuffer buffer = ByteBuffer.allocate(3*3*4);
buffer.order(ByteOrder.nativeOrder());
vertices = buffer.asFloatBuffer();
vertices.put(-0.5f);
vertices.put(-0.5f);
vertices.put(0);
vertices.put(0.5f);
vertices.put(-0.5f);
vertices.put(0);
vertices.put(0);
vertices.put(0.5f);
vertices.put(0);
vertices.rewind();
ByteBuffer textbuffer = ByteBuffer.allocate(3*4*2);
textbuffer.order(ByteOrder.nativeOrder());
texCoords = textbuffer.asFloatBuffer();
texCoords.put(0);
texCoords.put(1);
texCoords.put(1);
texCoords.put(1);
texCoords.put(0.5f);
texCoords.put(0);
texCoords.rewind();
Bitmap bitmap = null;
try
{
bitmap = BitmapFactory.decodeStream(getAssets().open("droid.png"));
} catch (Exception ex)
{
Log.d("Texture Sample", "Couldn't load bitmap 'droid.png'");
}
int[] texturIDs = new int[1];
gl.glGenTextures(1,texturIDs,0);
texturID = texturIDs[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
bitmap.recycle();
}
@Override
public void mainLoopIteration(GameActivity activity, GL10 gl)
{
gl.glViewport(0, 0, activity.getViewPortWidht(), activity.getViewPortHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
}
在第一次调用glEnableCLientState()
之后,我在GLSurfaceView
类中得到了一个IllegalArgumentException
。
有没有人遇到过这种错误,或者知道问题是什么?
发布于 2011-12-19 05:21:00
在您的mainLoopIteration()
中,尝试直接绑定到纹理元素,而不是绑定到纹理元素数组。
//Like this
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID[0]);
//Instead of like this
//gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
发布于 2011-12-22 22:14:55
还要记住,在glDrawArrays()
之后,您需要为每个启用状态调用相应的glDisableClientState()
。
此外,你只需要在视口大小改变时设置glViewport()
(通常在GLSurfaceView.Renderer
的onSurfaceChanged()
/ onSurfaceCreated()
中);
https://stackoverflow.com/questions/8552122
复制相似问题