Pregunta

Me acaba de empezar con OpenGL ES 2.0, lo que me gustaría hacer es crear algunos simples documentación 2D. Teniendo en cuenta una resolución de 480x800, ¿cómo puedo dibujar una textura de fondo?

[Mi entorno de desarrollo es Java / Android, por lo ejemplos que se refieren directamente a eso sería mejor, pero otros idiomas estarían bien.]

¿Fue útil?

Solución

A pesar de que estás en Android, que creó una aplicación de ejemplo iPhone que hace esto por cuadros de video que vienen. Puede descargar el código para esta muestra de here . Tengo una valoración crítica acerca de esta aplicación, que hace el seguimiento de objetos a base de color usando video en vivo, que se puede leer aquí .

En esta aplicación, saco dos triángulos para generar un rectángulo, entonces la textura que el uso de las siguientes coordenadas:

   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,
    };

pase a través del fotograma de vídeo como una textura, utilizo un programa simple con la siguiente shader vértice:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

y el siguiente fragmento shader:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);
}

El dibujo es una simple cuestión de utilizar el programa adecuado:

glUseProgram(directDisplayProgram);

Configuración de la textura uniforme:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

establecer los atributos:?

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

y después dibujar los triángulos:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Otros consejos

No realmente dibujar un fondo, en lugar de dibujar un rectángulo (o, más correctamente: dos triángulos que forman un rectángulo) y establece una textura a eso. Esto no es diferente en absoluto de dibujo cualquier otro objeto en la pantalla.

Hay un montón de lugares que muestran cómo se hace esto, puede que incluso hay un proyecto de ejemplo que muestra este androide.

La parte difícil es encontrar algo que en la pantalla delante o detrás de otra cosa. Para que esto funcione, es necesario establecer un buffer de profundidad y permitir la prueba de profundidad (glEnable (GL_DEPTH_TEST)). Y sus vértices necesita tener una coordenada Z (y di glDrawElements que sus vértices se componen de tres valores, no dos).

Si no lo hace, los objetos se representará en el orden de sus glDrawElements () funciones son llamadas (es decir lo que se dibuja última va a terminar oscureciendo el resto).

Mi consejo es no tener una imagen de fondo o de fantasía hacer nada hasta que el cuelgue de ella. OpenGL ES 2.0 tiene una especie de curva de aprendizaje y tutoriales sobre ES 1.x realmente no ayuda a conseguir 3D para el trabajo, ya que pueden utilizar las funciones auxiliares como gluPerspective, que 2.0 simplemente no tiene. Comenzar con la creación de un triángulo sobre un fondo de la nada. A continuación, lo convierten en un cuadrado. Entonces, si quieres ir de fantasía ya, añadir una textura. Jugar con las posiciones. Vea lo que sucede cuando se cambia el valor Z de sus vértices. (Pista: No mucho, si no tiene habilitada la prueba de profundidad E incluso entonces, si usted no tiene proyección en perspectiva, los objetos no se hacen más pequeños cuanto más lejos están lejos, por lo que todavía le parecerá como si nada. sucedido)

Después de unos días, deja de ser tan condenadamente frustrante, y que finalmente "hacer las cosas", en su mayoría.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top