我注意到,当GLSL版本是我的GLSL着色器不能编译低于130OpenGL着色语言向后兼容性
什么是对于具有向后兼容的着色器源最关键的要素是什么?我不想完全向后兼容,但我想了解在GLSL低于130的GPU上运行简单(向前兼容)着色器的主要指导原则。
当然,问题可以解决与预处理器
#if __VERSION__ < 130
#define VERTEX_IN attribute
#else
#define VERTER_IN in
#endif
但可能有很多问题,我忽略。
我注意到,当GLSL版本是我的GLSL着色器不能编译低于130OpenGL着色语言向后兼容性
什么是对于具有向后兼容的着色器源最关键的要素是什么?我不想完全向后兼容,但我想了解在GLSL低于130的GPU上运行简单(向前兼容)着色器的主要指导原则。
当然,问题可以解决与预处理器
#if __VERSION__ < 130
#define VERTEX_IN attribute
#else
#define VERTER_IN in
#endif
但可能有很多问题,我忽略。
最近的活动推动了这个老问题,我意识到我解决了这个问题。这并不容易,但它是一个成功的解决方案,由许多基于它的着色器以及编译着色器源代码的驱动程序数量证明。
从本质上讲,我用了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或更高版本的核心配置文件,就不再需要上述的着色器。
阅读"OpenGL Shading Language, Bill Licea-Kane, AMD, SIGGRAPH 2009"。你可能需要将以下代码添加到您的应用程序以支持GLSL-140,130和120的版本:
#version 150 compatibility
谢谢,但我想要避免的兼容性标志,使着色器源代码可编译为不同版本使用预处理器。 – Luca 2011-01-25 18:06:04