2010-04-13 99 views
5

我注意到,当GLSL版本是我的GLSL着色器不能编译低于130OpenGL着色语言向后兼容性

什么是对于具有向后兼容的着色器源最关键的要素是什么?我不想完全向后兼容,但我想了解在GLSL低于130的GPU上运行简单(向前兼容)着色器的主要指导原则。

当然,问题可以解决与预处理器

#if __VERSION__ < 130 
#define VERTEX_IN attribute 
#else 
#define VERTER_IN in 
#endif 

但可能有很多问题,我忽略。

回答

2

最近的活动推动了这个老问题,我意识到我解决了这个问题。这并不容易,但它是一个成功的解决方案,由许多基于它的着色器以及编译着色器源代码的驱动程序数量证明。

从本质上讲,我用了GL_ARB_shading_language_include扩展(和我还实施了对那些没有实现IT系统的源预处理),我结束了定义以下着色器包括源:

// 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 

的确,包括着色器在内的着色器源代码之前,框架可以在各种编译器上编译。当然,框架必须检测实际的系统功能,并定义编译器参数才能正确完成工作(考虑线宽着色器,因为线宽> 1.0弃用)。

当然,着色器基础结构可以定义最低要求。一旦着色器需要GLSL 1.50或更高版本的核心配置文件,就不再需要上述的着色器。

1
  • 放的#Version 110或120的#Version作为着色器
  • 测试它们变成从ATI
  • 的ShaderAnalyst
  • 测试代码上的实际的图形卡来自不同厂商的大量的第一行
0

拿出从你的着色器的#Version线和测试代码许多具有不同GPU功能的不同计算机。你会看到你的着色器兼容性会增加。 #version指令有时会导致着色器失败,即使该机器中的GPU可以在未给出版本号时执行所有着色器代码。

+0

是的,在运行时插入#version指令取决于从一开始的系统功能。拥有可扩展的引擎至关重要;但是,大多数系统支持先进的GLSL功能。 – Luca 2013-07-03 18:58:36

+0

省略#version默认为GLSL 1.1 – Luca 2013-07-03 19:03:38