Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在opengl中加载图像_Java_Opengl - Fatal编程技术网

Java 无法在opengl中加载图像

Java 无法在opengl中加载图像,java,opengl,Java,Opengl,这是我的班级SimpleBox。 我只得到正方形的纹理,而不是图像。 我在很多网站上读到,图片的大小应该是2的幂,我使用的图片的大小也是2的幂,但我仍然无法获得图片 我哪里做错了 您尚未在GLUtils.texImage2D调用中指定纹理内部格式。它应该是例如GL_RGB。 您可以在每次绘制调用时创建纹理,但在第一次调用后,位图将不再是有效的位图。recycle;。 您可以在每次绘制调用时创建纹理,但从不删除它。很有可能过一段时间你就会失去记忆。 简言之,将纹理创建移出绘图并更正其内部格式。我知

这是我的班级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;
    }
}