Je veux avoir la même source de shader pour OpenGL ES et OpenGL (Windows). Pour ce faire, je veux définir des types de données personnalisés et utiliser uniquement les fonctions OpenGL ES.
Une approche est de définir: p> pour Windows Shader et écrivez le shader telle qu'elle est pour OpenGL ES. P> Autre approche consiste à définir Types de données personnalisés comme celui-ci pour OpenGL ES: P> et comme ceci pour Windows P> Que pensez-vous être meilleur ? Avez-vous d'autres solutions pour ce problème? P> P>
3 Réponses :
Vous pouvez utiliser http://www.opengl.org/registry/specs /Arb/es2_compatibility.txt p>
Cette extension ajoute la prise en charge des fonctionnalités de OpenGL ES 2.0 qui sont manquantes à partir de OpenGL 3.x. L'activation de ces fonctionnalités facilitera le processus de portage d'applications de OpenGL ES 2.0 à OpenGL. P> blockQuote>
Est-ce que quelqu'un sait comment cela fonctionne? J'ai scimé à travers la spécification mais je n'ai rien trouvé liée à la manière dont une GLSL ES (version 100) et GLSL (version 150) serait compatible du tout.
Pour une référence future, j'ai découvert que sous ES2_Compatibilité, un contexte OpenGL 3.2> peut charger ES 2.0 Shaders avec #Version 100 en haut.
Ma solution a été d'écrire du code de shader compatible avec les API, puis lors de la téléchargement du code source de fragment Shader pour OpenGL ES, vous devez simplement préparer la ligne suivante: qui définit le Précision de point flottante par défaut à moyen. Dans OpenGL ES Fragment Shaders, il n'y a pas de niveau de précision par défaut pour les valeurs de points flottants, ce qui signifie que vous devez spécifier une précision sur chaque déclaration de point flottante ou définir explicitement une précision par défaut. Vous pouvez utiliser Pour plus de détails, voir la section 4.5.3 de l'ombrage OpenGL ES Spécification de la langue: http://www.khronos.org/files/opengles_shading_language.pdf < / p> Vous pouvez également mélanger cette approche avec votre approche lowp code> ou
highp code> si cela rend plus sens à votre application. P>
#define code> si vous avez besoin de contrôle plus fin sur la précision dans vos shaders. P> P>
Je l'ai réussi en définissant simplement les éléments suivants au début de chaque shader lorsque le shader fonctionne sous Windows: supplémentaire, je donne au shader les informations que plateform utilisées (Windows, mobile , IOS) qui peut être utilisé de cette façon: p>
Upvote tempéré pour la partie supérieure du commentaire - Je pense qu'il est beaucoup plus utile d'avoir les modificateurs de précision et de les jeter sur des plates-formes non pertinentes que de ne pas les inclure et d'être au détriment de la performance ailleurs. Mais #Ifdef gl_es code> (et
#Ifndef code>) est le moyen le plus simple de compiler conditionnellement, en cours d'introduction.