6
votes

OpenGL ES et OpenGL Compatibles Shaders

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: xxx

pour Windows Shader et écrivez le shader telle qu'elle est pour OpenGL ES.

Autre approche consiste à définir Types de données personnalisés comme celui-ci pour OpenGL ES: xxx

et comme ceci pour Windows xxx

Que pensez-vous être meilleur ? Avez-vous d'autres solutions pour ce problème?


0 commentaires

3 Réponses :


5
votes

Vous pouvez utiliser http://www.opengl.org/registry/specs /Arb/es2_compatibility.txt

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.


2 commentaires

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.



5
votes

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: xxx

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 lowp ou highp si cela rend plus sens à votre application.

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 #define si vous avez besoin de contrôle plus fin sur la précision dans vos shaders.


0 commentaires

2
votes

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: xxx

supplémentaire, je donne au shader les informations que plateform utilisées (Windows, mobile , IOS) qui peut être utilisé de cette façon: xxx


1 commentaires

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 (et #Ifndef ) est le moyen le plus simple de compiler conditionnellement, en cours d'introduction.