Java 无法在opengl中加载图像
这是我的班级SimpleBox。 我只得到正方形的纹理,而不是图像。 我在很多网站上读到,图片的大小应该是2的幂,我使用的图片的大小也是2的幂,但我仍然无法获得图片 我哪里做错了 您尚未在GLUtils.texImage2D调用中指定纹理内部格式。它应该是例如GL_RGB。 您可以在每次绘制调用时创建纹理,但在第一次调用后,位图将不再是有效的位图。recycle;。 您可以在每次绘制调用时创建纹理,但从不删除它。很有可能过一段时间你就会失去记忆。Java 无法在opengl中加载图像,java,opengl,Java,Opengl,这是我的班级SimpleBox。 我只得到正方形的纹理,而不是图像。 我在很多网站上读到,图片的大小应该是2的幂,我使用的图片的大小也是2的幂,但我仍然无法获得图片 我哪里做错了 您尚未在GLUtils.texImage2D调用中指定纹理内部格式。它应该是例如GL_RGB。 您可以在每次绘制调用时创建纹理,但在第一次调用后,位图将不再是有效的位图。recycle;。 您可以在每次绘制调用时创建纹理,但从不删除它。很有可能过一段时间你就会失去记忆。 简言之,将纹理创建移出绘图并更正其内部格式。我知
简言之,将纹理创建移出绘图并更正其内部格式。我知道哪里出了问题。在位图加载到该纹理后,我正在使用0绑定该纹理。因此,我得到了黑色的纹理。在对此进行评论后,我得到了带有图像的纹理。要添加到这一点,在调用draw之前,纹理也会解除绑定。@Keltar-谢谢您的建议。进行指定的更改后,纹理本身不会显示GLUtils.TEXAGERAGE2DGL10.GL_纹理_2D,0,GL10.GL_RGBA,位图,GL10.GL_浮点,0;2雷托·科拉迪-Thanks@Keltar-如何检查位图图像是否加载到纹理?我使用了glGetError,返回状态为零。有没有其他方法可以检查这一点?@ShashankSegu glGetTexImage可用于读取和验证纹理纹理。或GL调试器之一。但这不太可能是你的问题。draw函数之后的glGetError是什么?你当前的代码是什么?不要替换旧代码,只需将其添加到问题的尾部即可?我希望你没有花2天的时间来跟踪它。我在另一个答案下的评论中指出了这一点。@Reto Koradi-谢谢!!
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;
}
}