Question

Je viens juste de commencer avec OpenGL ES 2.0, ce que je voudrais faire est de créer une sortie simple 2D. Compte tenu d'une résolution de 480x800, comment puis-je dessiner une texture de fond?

[Mon environnement de développement est Java / Android, donc des exemples ayant trait directement à ce serait mieux, mais d'autres langues serait bien.]

Était-ce utile?

La solution

Même si vous êtes sur Android, je créé une application iPhone de l'échantillon qui fait cela, vous pouvez télécharger le code pour les cadres de la vidéo à venir. Pour cet échantillon here. J'ai un writeup sur cette application, qui fait le suivi des objets à base de couleur en utilisant la vidéo en direct, que vous pouvez lire .

Dans cette application, je dessine deux triangles afin de générer un rectangle, alors que la texture en utilisant les coordonnées suivantes:

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

Pour passer à travers l'image vidéo comme une texture, j'utilise un programme simple avec le vertex shader suivant:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

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

et le fragment shader suivant:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

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

Le dessin est une simple question d'utiliser le bon programme:

glUseProgram(directDisplayProgram);

réglage de l'uniforme de la texture:

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

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

Définition des attributs:

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

et ensuite tirer les triangles:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Autres conseils

Vous ne tire pas vraiment un arrière-plan, au lieu que vous dessinez un rectangle (ou, plus correctement: deux triangles formant un rectangle) et définir une texture à cela. Ce ne diffère pas du tout de dessin tout autre objet à l'écran.

Il y a beaucoup d'endroits montrant comment cela se fait, peut-être il y a même un exemple de projet android montrant cela.

La partie délicate devient quelque chose à l'affichage devant ou derrière autre chose. Pour que cela fonctionne, vous avez besoin de mettre en place un tampon de profondeur et permettre de tester la profondeur (glEnable (GL_DEPTH_TEST)). Et vos sommets doivent avoir une coordonnée Z (et dire que vos glDrawElements sommets sont composés de trois valeurs, et non deux).

Si vous ne le faites pas, les objets seront rendus dans l'ordre de leurs fonctions glDrawElements () sont appelés (ce qui signifie selon vous dessinez la dernière finira par obscurcir le reste).

Mon conseil est de ne pas avoir une image de fond ou de faire quoi que ce soit de fantaisie jusqu'à ce que vous obtenez le coup de lui. OpenGL ES 2.0 a en quelque sorte d'une courbe d'apprentissage abrupte, et des tutoriels sur ES 1.x ne aident pas vraiment à obtenir 3D au travail, car ils peuvent utiliser des fonctions auxiliaires comme gluPerspective, qui 2.0 ne fonctionne tout simplement pas. Commencez par créer un triangle sur un fond de rien. Ensuite, faire un carré. Ensuite, si vous voulez aller de fantaisie déjà, ajouter une texture. Jouez avec des positions. Voyez ce qui se passe lorsque vous modifiez la valeur Z de vos sommets. (Indice: Pas beaucoup, si vous n'avez pas le test de profondeur activée et même alors, si vous ne disposez pas de projection en perspective, les objets ne rapetissent plus ils sont loin, il semblera encore comme si rien. passé)

Après quelques jours, il cesse d'être si sacrément frustrant, et vous enfin « l'obtenir », la plupart du temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top