6
votes

OpenGL Shading Language Compatibilité à l'envers

J'ai remarqué que mes shaders GLSL ne sont pas compilables lorsque la version GLSL est inférieure à 130.

Quels sont les éléments les plus critiques pour avoir une source de shader compatible en arrière? Je ne veux pas avoir une compatibilité en retard complète, mais j'aimerais comprendre les principales directives pour avoir de simples shaders (compatibles en avant) qui fonctionnent sur GPU avec GLSL inférieure à 130.

bien sûr le problème pourrait être résolu avec le préprocesseur xxx

mais il y a probablement de nombreux problèmes que j'ignore.


0 commentaires

4 Réponses :


1
votes
  • mettre #version 110 ou #version 120 comme première ligne de vos shaders
  • Testez-les dans le ShaderAnalyste de ATI
  • Testez votre code sur beaucoup de cartes graphiques réelles de différents fournisseurs

0 commentaires

0
votes

Lire "OpenGL Shading Language, Bill Licea -Kane, AMD, Siggraph 2009 ". Vous devez probablement ajouter le code suivant à votre application afin de prendre en charge les versions GLSL-140, 130 et 120:

#version 150 compatibility


1 commentaires

Merci, mais ce que j'essayais, c'est d'éviter le drapeau de compatibilité, en effectuant le code source de shader compilable pour différentes versions en utilisant uniquement le préprocesseur.



0
votes

Sortez la ligne # # / em> de vos shaders et testez votre code sur de nombreux ordinateurs différents avec des capacités de GPU variables. Vous verrez que votre compatibilité de shader augmentera. La directive de #version provoquera parfois une shader d'échouer même si le GPU de cette machine peut exécuter tout le code de shader lorsque son numéro n'est pas donné un numéro de version.


2 commentaires

Oui, la directive #version est insérée au moment de l'exécution en fonction des capacités du système depuis le début. Il est essentiel d'avoir un moteur évolutif; Cependant, la plupart du système prennent en charge les fonctionnalités de GLSL avancées.


Omettre les valeurs par défaut de #vversion à GLSL 1.1



3
votes

Activités récentes a poussé cette ancienne question et j'ai réalisé que je résolvai la question. Ce n'était pas facile, mais c'est une solution réussie, prouvée par de nombreuses shaders basées sur elle et le nombre de pilotes qui compilait la source de shader.

essentiellement, j'ai utilisé le gl_arb_shading_language_include_language_include extension (et j'ai également mis en place un prétraiteur source pour le système qui ne le met pas en œuvre), et j'ai fini par Définissez la Shader suivante Inclure la source: P>

//  Copyright (C) 2011-2013 Luca Piccioni
// 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
// 
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
// 
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.

// @BeginInterface

// Shader renderer

// Symbol defined if running on NVIDIA renderer.
#define DS_VENDOR_NVIDIA            1
// Symbol defined if running on ATI/AMD renderer.
#define DS_VENDOR_AMD               2
// Symbol defined if running on INTEL renderer
#define DS_VENDOR_INTEL             3

// Shader inputs and outputs keywords
//
// - ATTRIBUTE: used to mark a vertex shader inputs
// - SHADER_IN: used to mark a non-vertex shader inputs
// - SHADER_OUT: used to mark a non-fragment shader output
// - OUT: used to mark a fragment shader output
#if __VERSION__ >= 130

#define ATTRIBUTE in
#define SHADER_IN in
#define SHADER_OUT out
#define OUT out

#else

#define ATTRIBUTE attribute
#define SHADER_IN varying
#define SHADER_OUT varying
#define OUT

#endif

// Support array attributes
#if __VERSION__ >= 130

#define ARRAY_ATTRIBUTE(name, size) name[size]

#else

#define ARRAY_ATTRIBUTE(name, size) name[size]

#endif

// Uniform blocks
#if __VERSION__ >= 130

#define BEGIN_UNIFORM_BLOCK(name)   uniform name {

#define END_UNIFORM_BLOCK() };

#else

#define BEGIN_UNIFORM_BLOCK(name)

#define END_UNIFORM_BLOCK()

#endif

// Input and output blocks
#if __VERSION__ >= 150

#define BEGIN_INPUT_BLOCK(name) in name {
#define END_INPUT_BLOCK() };

#define BEGIN_OUTPUT_BLOCK(name) out name {
#define END_OUTPUT_BLOCK() };

#else

#define BEGIN_INPUT_BLOCK(name)
#define END_INPUT_BLOCK()

#define BEGIN_OUTPUT_BLOCK(name)
#define END_OUTPUT_BLOCK()

#endif

// Texturing functions
#if __VERSION__ >= 130

#define TEXTURE_2D texture
#define TEXTURE_3D texture
#define TEXTURE_RECT texture
#define TEXTURE_CUBE texture

#if __VERSION__ >= 150
#define TEXTURE_SIZE(sampler) textureSize(sampler)
#else
#define TEXTURE_SIZE(sampler) sampler ## _Size
#endif

#else

#define TEXTURE_2D texture2D
#define TEXTURE_3D texture3D
#define TEXTURE_RECT texture2DRect
#define TEXTURE_CUBE textureCube

#endif

// Invariance
#if __VERSION__ >= 120
#define INVARIANT invariant
#else
#define INVARIANT
#endif

// Attribute location
#if defined(GL_ARB_explicit_attrib_location)
#define LOCATION(loc)       layout(location = loc)
#else
#define LOCATION(loc)
#endif

// Geometry shader layout
#if __VERSION__ >= 150
#define GEOMETRY_LAYOUT_IN(from) layout (from) in
#define GEOMETRY_LAYOUT(to, max) layout (to, max_vertices = max) out
#else
#define GEOMETRY_LAYOUT_IN(from)
#define GEOMETRY_LAYOUT(to, max)
#endif

// @EndInterface


0 commentaires