How to draw a texture as a 2D background in OpenGL ES 2.0?

后端 未结 2 879
无人共我
无人共我 2020-12-07 16:49

I\'m just getting started with OpenGL ES 2.0, what I\'d like to do is create some simple 2D output. Given a resolution of 480x800, how can I draw a background texture?

2条回答
  •  眼角桃花
    2020-12-07 17:49

    Even though you're on Android, I created an iPhone sample application that does this for frames of video coming in. You can download the code for this sample from here. I have a writeup about this application, which does color-based object tracking using live video, that you can read here.

    In this application, I draw two triangles to generate a rectangle, then texture that using the following coordinates:

       static const GLfloat squareVertices[] = {
            -1.0f, -1.0f,
            1.0f, -1.0f,
            -1.0f,  1.0f,
            1.0f,  1.0f,
        };
    
        static const GLfloat textureVertices[] = {
            1.0f, 1.0f,
            1.0f, 0.0f,
            0.0f,  1.0f,
            0.0f,  0.0f,
        };
    

    To pass through the video frame as a texture, I use a simple program with the following vertex shader:

    attribute vec4 position;
    attribute vec4 inputTextureCoordinate;
    
    varying vec2 textureCoordinate;
    
    void main()
    {
        gl_Position = position;
        textureCoordinate = inputTextureCoordinate.xy;
    }
    

    and the following fragment shader:

    varying highp vec2 textureCoordinate;
    
    uniform sampler2D videoFrame;
    
    void main()
    {
        gl_FragColor = texture2D(videoFrame, textureCoordinate);
    }
    

    Drawing is a simple matter of using the right program:

    glUseProgram(directDisplayProgram);
    

    setting the texture uniform:

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, videoFrameTexture);
    
    glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   
    

    setting the attributes:

    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
    glEnableVertexAttribArray(ATTRIB_VERTEX);
    glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
    glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);
    

    and then drawing the triangles:

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    

提交回复
热议问题