mercredi 15 février 2012

OpenGL ES à partir de zéro, la partie 5: Vivre dans un monde matérialiste

Bon, dans le dernier versement, Nous avons parlé des lumières, la façon de les mettre en place et quels sont les attributs qu'ils ont. Nous avons également parlé des trois composantes de la lumière, diffuse, ambient, Et specular. Si vous n'êtes pas entièrement clair sur celles-ci, vous pourriez vouloir examiner, comme ces composants sont utilisés massivement dans la définition des matériaux.

component.jpg

L'image Source Wikimedia Commons, modifié comme autorisé par la licence.


Comme point de départ pour cette tranche, nous allons utiliser le Sphère de procédure projet de cette annonce. Nous sommes le passage à une sphère plutôt que de continuer avec l'icosaèdre que nous avons utilisé jusqu'à présent en raison d'une sphère est la forme idéale pour montrer comment les différentes composantes de lumières et de matières interagissent les uns avec les autres.

Quelle est la couleur


Alors, parlons de quelle couleur est. C'est probablement une révision pour toute personne qui a passé l'école d'art de qualité, mais nous allons le faire quand même. Pourquoi les choses ont la couleur dans le monde réel? Quelles sont les causes?

Lumière que nous pouvons voir est appelé le spectre de lumière visible. Nous percevons des couleurs différentes en fonction de la longueur d'onde de cette lumière. À une extrémité du spectre visible, nous avons la plus haute fréquence, longueur d'onde inférieure violets et bleus, et à l'autre bout, nous avons la plus basse fréquence, les oranges et les rouges de longueur d'onde plus élevée:

visible_spectrum.png


Les ondes électromagnétiques qui se situent en dehors de cette gamme - à la fois supérieure et inférieure - ne sont pas "lumière visible", mais il est la distinction OFAN quelque chose d'artificiel puisque la seule différence est la longueur d'onde, la fréquence et la capacité de l'œil humain de le percevoir. Toutefois, cette capacité à percevoir les ondes électromagnétiques, c'est tout, donc nous aussi loin que OpenGL est concernée, le spectre visible est tout ce que nous préoccupent.

Maintenant, «lumière blanche» contient des quantités égales de toutes les longueurs d'onde. En d'autres termes, la lumière blanche est blanc car il contient tous (ou au moins la plupart) des fréquences de la lumière visible. Si vous avez déjà expérimenté avec un prisme, vous avez vu cet effet dans l'action:

PrismAndLight.jpg


Le prisme réfracte la lumière blanche pour que la lumière aux longueurs d'onde différentes est séparé. C'est aussi le processus par lequel les arcs sont créés et ZOMG poneys! Non, pas vraiment sur les poneys, mais c'est vrai sur les arcs en ciel.

Maintenant, si vous regardez un objet, et il apparaît en bleu, ce qui se passe est que l'objet absorbe la plupart de l'extrémité inférieure de la gamme visible. L'objet absorbe rouge, orange, jaune clair et vert. Selon la teinte de bleu, il peut également être absorber violet et du bleu.

Mais la plupart des longueurs d'onde bleues sont réfléchie vers l'œil. Parce que certains de la lumière visible a été absorbée, la lumière étant de refléter à votre oeil n'est plus blanc parce qu'il ne contient plus de toutes les longueurs d'onde du spectre visible.

Assez simple, non? Voyons comment cela s'applique à OpenGL.

Matériaux OpenGL


Pour définir une couleur d'un matériau en OpenGL ES, nous définissons comment ce matériau réfléchit la lumière, tout comme la manière dont les choses fonctionnent dans le monde réel. Si un matériau est mis en place pour réfléchir la lumière rouge, puis il apparaîtra en rouge lorsque figurant sous réguliers, la lumière blanche.

En OpenGL (du moins quand lors de l'utilisation ombrage lisse et lumières) matériaux n'ont pas seulement une seule couleur. Nous avons la possibilité de spécifier exactement comment le matériel reflète chacune des trois composantes de lumières OpenGL (ambiante, diffuse et spéculaire) séparément. De plus, nous avons la capacité de spécifier le matériau de emissive la propriété, dont nous parlerons un peu plus tard.

Spécification d'un matériau


Pour créer un matériau en OpenGL, nous faisons un ou plusieurs appels soit glMaterialf () ou glMaterialfv (). De la même façon que nous avons spécifié des lumières dans le dernier versement, nous avons souvent à faire des appels multiples à ces fonctions pour définir pleinement le matériel, car chaque attribut ou d'un composant doit être spécifié individuellement en faisant un appel séparé. Tout composant ou d'un attribut qui n'est pas spécifié par défaut à zéro ou, dans le cas des couleurs, le noir.

Le premier paramètre passé à deux glMaterialf () ou glMaterialfv () est toujours un GL_ENUM qui spécifie si le matériau affecte le front, le dos, ou les deux faces avant et arrière de polygones. Il ya en fait inutile d'avoir ce premier argument en OpenGL ES autres que pour la compatibilité avec OpenGL ES, car il n'ya qu'une seule option valable: GL_FRONT_AND_BACK, qui indique simplement que les matériaux sont utilisés pour tout polygone qui est dessiné. Si vous vous souvenez de partie 1, Les triangles ont un avant et un arrière qui est déterminée par leur enroulement (pour les sommets sont tirées). Par défaut, seule la face d'un triangle est dessiné en OpenGL, mais il est possible de faire OpenGL dessiner le dos, ou même pour dessiner uniquement le dos, et OpenGL régulière serait vous permettent de spécifier des matériaux différents pour avant et arrière en passant soit GL_FRONT, GL_BACK ou GL_FRONT_AND_BACK. Mais, OpenGL ES ne supporte aucune autre option que GL_FRONT_AND_BACK, alors juste passer que toujours, 'kay?

Le second paramètre à glMaterialf () ou glMaterialfv () est une GL_ENUM qui identifie quel composant ou d'un attribut de la matière que vous définissez. Ce sont les mêmes valeurs nous passâmes dans glLightfv (), comme GL_AMBIENT, avec quelques nouveaux, vous verrez dans un instant.

La valeur finale est soit un GL_FLOAT, ou un pointeur vers un tableau de GL_FLOATs qui contient la valeur réelle de l'attribut ou d'un composant.

Les composants les plus imoprtant d'un matériau qui doivent être mis en sont les composantes ambiantes et diffuses, car ils définissent comment un matériau reflète l'essentiel de la lumière étant brillé sur elle. Le projet de code que nous utilisons aujourd'hui a défini la lumière blanche, un peu comme la lumière produite par le soleil, ou une ampoule en ce qu'elle a toutes les longueurs d'onde de la lumière ou des couleurs représentées également. Si notre lumière ne sont pas blancs, l'apparition de notre sphère serait différente. La lumière bleue se reflétant sur un matériau rouge, par exemple, produisent une teinte violette. Pour simplifier, nous allons travailler uniquement avec la lumière blanche et vous pouvez vous sentir libre d'essayer de changer les couleurs de la lumière sur votre propre pour voir comment les lumières et les matériaux interagissent. Pour la plupart, ils interagissent dans OpenGL ES comme ils le feraient dans la vraie vie.

Voici ce que le projet ressemble quand il est lancé, avant d'ajouter tous les matériaux:

iPhone SimulatorScreenSnapz001.jpg


Comme vous pouvez le voir, nous avons quelques lumière ambiante et de lumière beaucoup plus diffus.

Ambient et Diffuse


Quand on parle de matériaux en OpenGL, nous avons besoin de parler des composantes ambiantes et diffuses dans le même temps, parce que ces deux travaillent ensemble pour définir la couleur perçue de l'objet. Rappelez-vous, la lumière diffuse est la partie supérieure de la sphère dans toute première image de cette annonce (le plus lumineux jaune), et la température ambiante est la plus sombre partie jaune sur le dessous. Comment le matériel reflète ces deux éléments détermineront quelle couleur que vous percevez l'objet à l'être. Maintenant, la photo ci-dessus aurait pu être réalisé dans plus d'un titre. Probablement, la sphère jaune reflète les propriétés ambiantes et diffuses dans la même proportion, mais la scène a moins de lumière ambiante définie.

Probablement 90% du temps ou plus, vous pourrez spécifier les paramètres ambiants et diffus d'un matériau exactement les mêmes. En faisant cela, elle devient la quantité d'diffuse et ambiante qui détermine l'ombrage et l'apparence de l'objet. Il est, en fait, un moyen de spécifier les composantes diffuses et ambiantes d'un matériau à la fois avec un seul appel à glMaterialfv (). Voici comment nous pourrions déclarer notre matériel à une nuance de bleu:

    GLfloat ambientAndDiffuse[] = {0.0, 0.1, 0.9, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ambientAndDiffuse);

Tout comme avec glColor4f (), la fixation d'un matériau dicte la façon dont tout est tirée jusqu'à une autre matière est spécifiée. Si le code est placé avant-dessus de notre code de dessin, et nous courons maintenant le projet, nous allons voir que notre sphère est devenue une seule nuance de bleu. Le dessous est encore plus sombre car notre lumière ambiante n'est pas aussi fort que notre lumière diffuse:

iPhone SimulatorScreenSnapz002.jpg


Il peut y avoir des moments où vous voulez plus de contrôle et que vous voulez spécifier la manière dont le matériel reflète la lumière diffuse et ambiante séparément. Par exemple, nous pourrions faire ce qui suit pour créer un matériau qui reflète le bleu de la lumière ambiante, mais le rouge de la lumière diffuse:

    GLfloat ambient[] = {0.0, 0.1, 0.9, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
GLfloat diffuse[] = {0.9, 0.0, 0.1, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);

Si nous courons cela, nous obtenons une apparence très différente:

iPhone SimulatorScreenSnapz003.jpg


Dans ce cas, il semble que nous sommes une lumière colorée sur la sphère, même si nous ne sommes pas. La raison pour laquelle il semble que le chemin est que nous sommes reflétant la lumière directionnelle différemment que la lumière ambiante.

Dans la plupart des cas, si vous voulez donner l'apparence de lumières colorées, puis créer des lumières colorées et de spécifier les couleurs de votre matériel à l'aide GL_AMBIENT_AND_DIFFUSE. Mais, il ya des moments où vous voudrez peut-être de les séparer pour créer des effets spéciaux ou de falsifier un cas isolé, lumière de tache de couleur, sans encourir les frais généraux d'une lumière supplémentaire. Rappelez-vous: Chaque lumière vous ajoutez augmente les calculs qui doivent être effectuées à chaque seconde, donc ce n'est pas une mauvaise idée de tricher parfois.

Spéculaire et la brillance


Vous pouvez également spécifier la manière dont votre lumière se reflète la composante spéculaire de lumières de la scène séparément les composantes diffuses et ambiantes. Cela vous donne la possibilité de contrôler comment lumineux le spéculaire "hot spot" est. Un paramètre séparé, appelé GL_SHININESS travaille avec composante spéculaire du matériau pour définir la taille du spot spéculaire chaud. Si vous ne spécifiez une valeur GL_SPECULAR pour votre matériel, vous devez également définir sa brillance. Le supérieur de la brillance, plus la réflexion spéculaire, donc la valeur par défaut de 0,0 a tendance à complètement submerger la composante diffuse et regarde généralement mauvais.

Revenons à notre sphère bleue, et ajouter une tache spéculaire chaud pour elle.

    GLfloat ambientAndDiffuse[] = {0.0, 0.1, 0.9, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ambientAndDiffuse);
GLfloat specular[] = {0.3, 0.3, 0.3, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 25.0);

Nous avons utilisé un DIM blanc pour notre valeur spéculaire. Cela peut sembler faible, mais la façon spéculaire est calculée, un peu semble aller un long chemin. La qualité de la composante spéculaire de la lumière est multipliée par composante spéculaire du matériau, et la lumière qui en résulte est concentrée dans la région dicté par la brillance de la matière. Voici ce que la sphère ressemble avec le code ci-dessus:

iPhone SimulatorScreenSnapz004.jpg


Nous avons maintenant une petite zone circulaire sur la sphère qui reflète davantage de lumière. Nous pouvons faire de cette brillante place en augmentant soit la composante spéculaire de notre lumière ou des lumières, ou en augmentant la shininesst de notre matériel. Nous pouvons également changer la taille de la lumière en modifiant légèrement la brillance. Les plus brillants du matériel, le plus concentré de la lumière spéculaire. Si nous changeons la brillance de 25,0 à 50,0, par exemple, nous obtenons une place beaucoup plus serré chaud, qui donne l'apparence d'une surface plus poli.

iPhone SimulatorScreenSnapz005.jpg


Voici un petit avertissement, cependant. Une partie de la raison pour laquelle je suis passé à sphères pour cette annonce, et la raison pour laquelle j'ai utilisé un décompte relativement élevé vertex pour cette sphère, c'est parce que les reflets spéculaires sur le low-poly objets ne semblent pas très bonnes. Regardez ce qui arrive si je réduis le nombre de sommets dans notre sphère à un nombre plus convivial de jeu:

iPhone SimulatorScreenSnapz006.jpg


Les reflets spéculaires ont tendance à rendre les bords triangle de se démarquer, et souligne souvent spéculaire juste ne semble pas bon pour le low-poly objets comme ceux que vous devriez utiliser dans un match. En OpenGL régulière, il ya quelque chose appelé un shader qui peut être utilisé pour réaliser de bons résultats avec les modèles low-poly, mais la version d'OpenGL ES sur l'iPhone ne dispose pas de shaders. La seule façon vous pouvez généralement faire des low-poly objets bien paraître dans les jeux est en oubliant totalement la composante spéculaire et l'utilisation de texture mapping, quelque chose que nous allons examiner à partir de la tranche suivante.

Emission


Il ya un dernier attribut important des matériaux que nous avons besoin de regarder, et cela s'appelle l'émission (ou parfois la émissive) composant. En fixant la composante d'émission, nous rendre le matériel ressemble il émet la lumière de la couleur, nous spécifions. Maintenant, ce n'est pas vraiment la lumière électroluminescente. Les objets proches, par exemple, ne sera pas affectée par la lumière émissive d'un autre objet. Si vous voulez faire un objet comme une ampoule qui brille réellement sur d'autres objets, vous devez combiner la composante d'émission avec une lumière réelle au même endroit que l'objet en raison (et cela va vous sembler redondante redondant), mais en OpenGL ES, les lumières ne fait émettre de la lumière. Mais, la composante d'émission peuvent être utilisés pour donner aux objets une lueur agréable.

Nous pourrions, par exemple, ajouter une belle glowiness vert à notre sphère bleue, en ajoutant ce code:

    GLfloat emission[] = {0.0, 0.4, 0.0, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission);

Cela nous donnerait un résultat qui ressemble à ceci:

iPhone SimulatorScreenSnapz007.jpg


La composante d'émission affecte la totalité du matériel, donc la valeur spécifiée pour GL_EMISSION est multipliée par tout type de lumière qui tombe sur un endroit précis sur l'objet. Notez que même les mettre en évidence spéculaire dans l'image ci-dessus a pris un peu d'un reflet bleu-vert plutôt que d'être un blanc pur. C'est subtil dans les spots lumineux, et le plus notable dans la zone inférieure, où seule la lumière ambiante est trop forte, mais elle affecte tout.

C'est tout ce qu'elle a écrit


Eh bien, j'ai pensé longuement et sérieusement à une sorte de madone de référence ou au moins une référence en musique 80, pour la conclusion ici pour attacher ensemble avec le titre du détachement, mais j'ai été totalement incapable de trouver quoi que ce soit, même à distance d'esprit, donc je vais devoir tout laisser ici.

Dans le prochain épisode, nous allons examiner mappage de texture, ce qui peut être utilisé aussi bien pour les deux dimensions des sprites et aussi pour donner des objets tridimensionnels des surfaces plus complexes que les matériaux permettent.

Aucun commentaire: