OpenGL ES 2.0的Andr​​oid的纹理 [英] OpenGL es 2.0 Android Texture

查看:297
本文介绍了OpenGL ES 2.0的Andr​​oid的纹理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法渲染贴图我的广场。我已经得到了我的计划,渲染色彩的空白方块。任何帮助是极大的AP preciated。

我已经重新设计了我code以下,相信与我如何建立我的顶点坐标和纹理坐标存在的问题。我也在我的调用glDrawArrays函数得到一个致命的libc信号11。

下面是顶点和纹理坐标:

 私人最终FloatBuffer vertexBuffer;
私人最终FloatBuffer textureBuffer;静态最终诠释COORDS_PER_VERTEX = 3;
静浮positionCoords [] = {//逆时针顺序:
    -1.0F,1.0F,1.0F,
    -1.0F,-1.0F,1.0F,
    1.0F,1.0F,1.0F,
    -1.0F,-1.0F,1.0F,
    1.0F,-1.0F,1.0F,
    1.0F,1.0F,1.0F,
};静态最终诠释COORDS_PER_TEXTURE = 2;
静浮textureCoords [] = {
    0.0,0.0,
    0.0,1.0F,
    1.0F,0.0,
    0.0,1.0F,
    1.0F,1.0F,
    1.0F,0.0,
};

下面是我的绘制函数在我的方形类:

 公共无效平局(浮动[] mvpMatrix)
{
    INT MVPMatrixHandle = GLES20.glGetUniformLocation(shader.getProgram(),u_MVPMatrix);
    INT textureHandler = GLES20.glGetUniformLocation(shader.getProgram(),u_s_texture);
    INT positionHandler = GLES20.glGetAttribLocation(shader.getProgram(),a_position);
    INT texCoordHandler = GLES20.glGetAttribLocation(shader.getProgram(),a_texCoord);        Log.d(TAG,设置GLProgram处理程序);
        GlRenderer.checkGlError(设置GLProgram处理程序);    GLES20.glEnableVertexAttribArray(positionHandler);
    GLES20.glEnableVertexAttribArray(texCoordHandler);        GlRenderer.checkGlError(EnableVertexAttribArrays);    GLES20.glVertexAttribPointer(positionHandler,COORDS_PER_VERTEX,
                                GLES20.GL_FLOAT,假的,
                                vertexStride,vertexBuffer);    GLES20.glVertexAttribPointer(textureHandler,COORDS_PER_TEXTURE,
                                GLES20.GL_FLOAT,假的,
                                textureStride,textureBuffer);        GlRenderer.checkGlError(VertexAttribPointers(位置,纹理));
    GLES20.glUniformMatrix4fv(MVPMatrixHandle,1,假,mvpMatrix,0);    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureID);    GLES20.glUniform1i(textureHandler,0);        GlRenderer.checkGlError(绑定纹理);    GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount);        GlRenderer.checkGlError(画阵列);    GLES20.glDisableVertexAttribArray(positionHandler);
    GLES20.glDisableVertexAttribArray(texCoordHandler);        GlRenderer.checkGlError(DisableVertexAttribArrays);
}


解决方案

我在上面code的主要问题是,我用的是 textureHandle 而不是事实的 texCoordHandler glVertexAttribPointer //纹理

在code应该是这样的:

  GLES20.glVertexAttribPointer(texCoordHandler,COORDS_PER_TEXTURE,
                            GLES20.GL_FLOAT,假的,
                            textureStride,textureBuffer);

由于这个问题出现了,我又一次改写我的code。添加索引(DRAWORDER),我的顶点和纹理阵列组合成一个顶点数组,而只是引用 vertexBuffer //包含位置坐标和纹理坐标在<$ C,而不是$ C> textureBuffer 和 vertexBuffer //只包含位置坐标

我也改变了 GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount); 来:

  GLES20.glDrawElements(GLES20.GL_TRIANGLES,indices.length,
                      GLES20.GL_UNSIGNED_SHORT,indexBuffer);

I cannot seem to render a Texture to my square. I have gotten my program to render the blank square with color. Any help is greatly appreciated.

I've redesigned my code to the following and believe that the problem exists with how I'm setting up my Vertex Coordinates and Texture Coordinates. I also get a libc Fatal signal 11 at my glDrawArrays function.

Here are the Vertex and Texture Coordinates:

private final FloatBuffer vertexBuffer;
private final FloatBuffer textureBuffer;

static final int COORDS_PER_VERTEX = 3;
static float positionCoords[] = { // in counterclockwise order:
    -1.0f, 1.0f, 1.0f,              
    -1.0f, -1.0f, 1.0f,
    1.0f, 1.0f, 1.0f, 
    -1.0f, -1.0f, 1.0f,                 
    1.0f, -1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
};

static final int COORDS_PER_TEXTURE = 2;
static float textureCoords[] = {
    0.0f, 0.0f,                 
    0.0f, 1.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,
};

Here's my draw function in my square class:

public void draw(float[] mvpMatrix) 
{
    int MVPMatrixHandle = GLES20.glGetUniformLocation(shader.getProgram(), "u_MVPMatrix");
    int textureHandler = GLES20.glGetUniformLocation(shader.getProgram(), "u_s_texture");
    int positionHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_position");
    int texCoordHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_texCoord");

        Log.d(TAG, "Setting up GLProgram Handlers");
        GlRenderer.checkGlError("Setup GLProgram Handlers");

    GLES20.glEnableVertexAttribArray(positionHandler);
    GLES20.glEnableVertexAttribArray(texCoordHandler);

        GlRenderer.checkGlError("EnableVertexAttribArrays");

    GLES20.glVertexAttribPointer(positionHandler, COORDS_PER_VERTEX,
                                GLES20.GL_FLOAT, false,
                                vertexStride, vertexBuffer);        

    GLES20.glVertexAttribPointer(textureHandler, COORDS_PER_TEXTURE,
                                GLES20.GL_FLOAT, false, 
                                textureStride, textureBuffer);

        GlRenderer.checkGlError("VertexAttribPointers (Position, Texture)");


    GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);

    GLES20.glUniform1i(textureHandler, 0);

        GlRenderer.checkGlError("Binding Texture");

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

        GlRenderer.checkGlError("Draw Arrays");

    GLES20.glDisableVertexAttribArray(positionHandler);
    GLES20.glDisableVertexAttribArray(texCoordHandler);

        GlRenderer.checkGlError("DisableVertexAttribArrays");
}

解决方案

My main problem in the above code was the fact that I was using the textureHandleinstead of the texCoordHandler in the glVertexAttribPointer //Texture

The code should look like this:

GLES20.glVertexAttribPointer(texCoordHandler, COORDS_PER_TEXTURE,
                            GLES20.GL_FLOAT, false, 
                            textureStride, textureBuffer);

Since this problem arose I've rewritten my code yet again. Adding indices (draworder), combining my Vertex and Texture arrays into a Vertices array, and just reference a vertexBuffer //Contains both position coordinates and texture coordinates instead of a textureBuffer and a vertexBuffer //Only contains position coordinates

I've also changed the GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); to:

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, 
                      GLES20.GL_UNSIGNED_SHORT, indexBuffer);

这篇关于OpenGL ES 2.0的Andr​​oid的纹理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆