OpenGLES:如何在应用了着色器的情况下从位图显示纹理?

时间:2018-08-16 14:15:49

标签: java android bitmap opengl-es

我有一个位图,想在应用了着色器的GLSurfaceView上进行渲染。 我是OpenGL(ES)的新手,所以我只是从教程中复制了一些代码片段。但是它们在不同的OpenGLES版本上。有人可以解释一下我如何将这段代码从GLES10转换为GLES20吗?

private int[] textures;
public Bitmap textureData;

private static final float[] VERTEX_COORDINATES = new float[] {
        -1.0f, +1.0f, 0.0f,
        +1.0f, +1.0f, 0.0f,
        -1.0f, -1.0f, 0.0f,
        +1.0f, -1.0f, 0.0f
};
private static final float[] TEXTURE_COORDINATES = new float[] {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f
};
private static final Buffer TEXCOORD_BUFFER = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4)
        .order(ByteOrder.nativeOrder()).asFloatBuffer().put(TEXTURE_COORDINATES).rewind();
private static final Buffer VERTEX_BUFFER = ByteBuffer.allocateDirect(VERTEX_COORDINATES.length * 4)
        .order(ByteOrder.nativeOrder()).asFloatBuffer().put(VERTEX_COORDINATES).rewind();




 @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    textures = new int[1];          
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_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);
    //--------------------------Shader-------------------------
    // Create the shaders
    //int vertexShader = ShaderSetup.loadShader(GLES20.GL_VERTEX_SHADER, ShaderSetup.vertexShaderCode);
    int fragmentShader = ShaderSetup.loadShader(GLES20.GL_FRAGMENT_SHADER, ShaderSetup.fragmentShaderCode);

    ShaderSetup.shader = GLES20.glCreateProgram();             // create empty OpenGL ES Program
   // GLES20.glAttachShader(ShaderSetup.shader, vertexShader);   // add the vertex shader to program
    GLES20.glAttachShader(ShaderSetup.shader, fragmentShader); // add the fragment shader to program
    GLES20.glLinkProgram(ShaderSetup.shader);                  // creates OpenGL ES program executables

    // Set our shader programm
    GLES20.glUseProgram(ShaderSetup.shader);
}

  @Override
public void onDrawFrame(GL10 gl) {

    if(textureData!=null) {
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, textureData, 0);
    }

    gl.glActiveTexture(GL10.GL_TEXTURE0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VERTEX_BUFFER);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TEXCOORD_BUFFER);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}

如果有人想知道为什么我要使用位图并在每次绘制时更改纹理:位图是来自cameraSDK的预览(目前我将输出byte []转换为位图,因为我不知道如何加载byte []作为纹理)。 提前非常感谢您的帮助。

0 个答案:

没有答案