android opengl无法正常渲染

时间:2016-10-12 14:25:37

标签: android opengl-es

将纹理渲染到视口时出现问题。 屏幕正在渲染,但纹理(256 * 256)与我上传的原始jpg图片不同。

请查看附件的附件图像和代码。一个图像是原始的jpg,另一个是截图,它是Android手机上的渲染纹理。

original

rendered image

这是我的MainActivity代码:

0x7F

这是我的加载纹理类

private void initialize() {
    if (hasGLES20()) {
        GLSurfaceView mGLView = new GLSurfaceView(this);
        mGLView.setEGLContextClientVersion(2);
        mGLView.setPreserveEGLContextOnPause(true);
        mGLView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        mGLView.setEGLConfigChooser(true);
        mGLView.setRenderer(this);
        setContentView(mGLView);
    }
}

@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
    GLES20.glClearColor(0.5f,0.3f,0.8f,1.0f);


    String vertexShaderSource = "" +
    "uniform mat4 u_projection;" +
    "uniform mat4 u_model;" +
    "uniform mat4 u_view;" +
    "" +
    "attribute vec4 a_position;" +
    "attribute vec2 a_texCoord;" +
    "" +
    "varying vec2 v_texCoord;" +

    "" +
    "void main()" +
    "{" +
    "   gl_Position = u_projection * u_view * u_model * a_position;" +

    "   v_texCoord = a_texCoord;" +

    "}";

    String fragmentShaderSource = "" +

    "varying vec2 v_texCoord;" +
    "uniform sampler2D s_texture;" +
    "" +
    "void main() {" +
    "   vec4 texCol = texture2D(s_texture, v_texCoord );" +
    "   gl_FragColor = texCol;" +

    "}";

    texture = new Texture(this);


    vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
    GLES20.glShaderSource(vertexShader, vertexShaderSource);
    GLES20.glCompileShader(vertexShader);
    String vertexShaderCompileLog = GLES20.glGetShaderInfoLog(vertexShader);

    fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
    GLES20.glShaderSource(fragmentShader, fragmentShaderSource);
    GLES20.glCompileShader(fragmentShader);
    String fragmentShaderCompileLog = GLES20.glGetShaderInfoLog(fragmentShader);

    programID = GLES20.glCreateProgram();
    GLES20.glAttachShader(programID,vertexShader);
    GLES20.glAttachShader(programID,fragmentShader);
    GLES20.glBindAttribLocation(programID, 0, "a_position");
    GLES20.glBindAttribLocation(programID, 1, "a_texCoord");
    GLES20.glLinkProgram(programID);

    String programLinkLog = GLES20.glGetProgramInfoLog(programID);
    GLES20.glUseProgram(programID);

    float[] modelMatrix = new float[16], viewMatrix = new float[16], projectionMatrix  = new float[16];


    ByteBuffer modelMatrixByteBuffer = ByteBuffer.allocateDirect(modelMatrix.length * 4);
    modelMatrixByteBuffer.order(ByteOrder.nativeOrder());
    FloatBuffer modelMatrixBuffer = modelMatrixByteBuffer.asFloatBuffer();
    Matrix.setIdentityM(modelMatrix,0);
    Matrix.translateM(modelMatrix, 0, modelMatrix,0,0,0,-2.0f);
    modelMatrixBuffer.put(modelMatrix);
    modelMatrixBuffer.rewind();

    // translate model to 0,0,-2
    Matrix.setLookAtM(viewMatrix,0,0,0,0,0,0,-10,0,1,0);
    Matrix.perspectiveM(projectionMatrix,0,70,256/256,0.1f,100);

    GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(programID,"u_projection"),1,false,projectionMatrix,0);
    GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(programID,"u_view"),1,false,viewMatrix,0);        
    GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(programID,"u_model"),1,false,modelMatrixBuffer);

}

@Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
    GLES20.glViewport(0,0,256,256);
}

@Override
public void onDrawFrame(GL10 gl10){

        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
        float vertices[] =
        {
            -1.0f,  1.0f, 0.0f,
            -1.0f, -1.0f, 0.0f,
             1.0f,  1.0f, 0.0f,
             1.0f, -1.0f, 0.0f
        };

        float textureCoord[] =
        {
             0.0f,  1.0f,
             0.0f,  0.0f,
             1.0f,  1.0f,
             0.0f,  1.0f
        };


        ByteBuffer verticesByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
        verticesByteBuffer.order(ByteOrder.nativeOrder());
        FloatBuffer verticesBuffer = verticesByteBuffer.asFloatBuffer();
        verticesBuffer.put(vertices);
        verticesBuffer.rewind();

        ByteBuffer textureCoordByteBuffer = ByteBuffer.allocateDirect(textureCoord.length * 4);
        textureCoordByteBuffer.order(ByteOrder.nativeOrder());
        FloatBuffer textureCoordBuffer = textureCoordByteBuffer.asFloatBuffer();
        textureCoordBuffer.put(textureCoord);
        textureCoordBuffer.rewind();

        GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 3 * 4, verticesBuffer);
        GLES20.glVertexAttribPointer(1, 2, GLES20.GL_FLOAT, false, 2 * 4, textureCoordBuffer);
        GLES20.glEnableVertexAttribArray(0);
        GLES20.glEnableVertexAttribArray(1);



    texture.setTexture();
    GLES20.glUniform1i(GLES20.glGetUniformLocation(programID,"s_texture"),0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}

任何帮助?

1 个答案:

答案 0 :(得分:0)

您的纹理坐标错误。它们包含两次相同的坐标:

float textureCoord[] =
{
     0.0f,  1.0f, <--
     0.0f,  0.0f,
     1.0f,  1.0f,
     0.0f,  1.0f  <--
};

要解决这个问题,请用[1,0]代替[0,1]替换最后一个坐标。