这是我的班级SimpleBox
我只得到方形纹理而不是图像
我在很多网站上都看到图像的大小应该是2的幂,我使用的图像的大小也是2的幂,但我仍然无法获得图像。
我哪里错了?
public class SimpleBox {
private FloatBuffer box,normal;
//private ByteBuffer bitimage;
//private FloatBuffer normals;
int[] textures = new int[1];
private float[] vertices={
-10.0f, 10.0f, 0.0f,
-10.0f, -10.0f, 0.0f,
10.0f, -10.0f, 0.0f,10.0f, 10.0f, 0.0f };
private float[] normals={
0.0f, 0.0f, 1.0f,0.0f, 0.0f, 1.0f,0.0f, 0.0f, 1.0f,0.0f, 0.0f, 1.0f
};
private float textureCoordinates[] = {0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f };
private FloatBuffer vertexBuffer;
private Bitmap bitmap;
public SimpleBox(Context context) {
bitmap =getBitmapFromAsset(context ,"images/pic4.jpg" ) ;
box = GraphicsUtil.makeFloatBuffer(textureCoordinates);
vertexBuffer=GraphicsUtil.makeFloatBuffer(vertices);
normal=GraphicsUtil.makeFloatBuffer(normals);
}
public final void draw(GL10 gl) {
try{
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, box);
gl.glNormalPointer(GL10.GL_FLOAT,0, normal);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3);
gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
}
catch(Exception e)
{
System.out.println(e);
}
}
public static Bitmap getBitmapFromAsset(Context context, String filePath) {
AssetManager assetManager = context.getAssets();
InputStream istr;
Bitmap bitmap = null;
try {
istr = assetManager.open(filePath);
bitmap = BitmapFactory.decodeStream(istr);
} catch (IOException e) {
// handle exception
e.printStackTrace();
}
return bitmap;
}
}
答案 0 :(得分:0)
GLUtils.texImage2D
调用中指定纹理内部格式。它应该是例如GL_RGB
。draw
来电时创建纹理,但在第一次调用位图之后不再有效(bitmap.recycle();
)。draw
调用上创建纹理,但从不删除它。很可能在一段时间后你会失去记忆。简而言之,将纹理创建移出draw
并更正其内部格式。
答案 1 :(得分:0)
我知道自己哪里出错了。我用" 0"将位图加载到该纹理后。因此,我得到了黑色纹理。评论完之后,我得到了图像的纹理。