首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IllegalArgumentException GLSurfaceView

IllegalArgumentException GLSurfaceView
EN

Stack Overflow用户
提问于 2011-12-18 21:46:34
回答 2查看 395关注 0票数 1

我刚刚开始学习OpenGL,并开始学习一些基础教程。然而,我尝试创建一个带有纹理的三角形。它看起来像这样

代码语言:javascript
运行
复制
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

有没有人遇到过这种错误,或者知道问题是什么?

EN

回答 2

Stack Overflow用户

发布于 2011-12-19 05:21:00

在您的mainLoopIteration()中,尝试直接绑定到纹理元素,而不是绑定到纹理元素数组。

代码语言:javascript
运行
复制
//Like this
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID[0]);

//Instead of like this
//gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
票数 0
EN

Stack Overflow用户

发布于 2011-12-22 22:14:55

还要记住,在glDrawArrays()之后,您需要为每个启用状态调用相应的glDisableClientState()

此外,你只需要在视口大小改变时设置glViewport() (通常在GLSurfaceView.RendereronSurfaceChanged() / onSurfaceCreated()中);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8552122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档