6

GLSL バージョンが 130 未満の場合、GLSL シェーダーがコンパイルできないことに気付きました。

下位互換性のあるシェーダー ソースを持つための最も重要な要素は何ですか? 完全な後方互換性は望んでいませんが、GLSL が 130 未満の GPU で単純な (前方互換性のある) シェーダーを実行するための主なガイドラインを理解したいと思います。

もちろん、問題はプリプロセッサで解決できます

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

しかし、おそらく私が無視している多くの問題があります。

4

4 に答える 4

3

最近の活動により、この古い疑問が押し上げられ、問題が解決したことに気付きました。簡単ではありませんでしたが、これは成功したソリューションであり、それに基づく多くのシェーダーと、シェーダー ソースをコンパイルするドライバーの数によって証明されています。

基本的に、私はGL_ARB_shading_language_include拡張機能を使用し (それを実装していないシステム用にソース プリプロセッサも実装しました)、次のシェーダー インクルード ソースを定義することになりました。

//  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 以降のコア プロファイルが必要になると、上記のシェーダー インクルードは不要になります。

于 2013-07-03T18:53:20.137 に答える
1
  • シェーダーの最初の行として#version110または#version120を配置します
  • それらをATIのShaderAnalystにテストします
  • さまざまなベンダーの実際のグラフィックカードの多くでコードをテストします
于 2010-04-20T22:34:45.417 に答える
0

「OpenGL シェーディング言語、Bill Licea-Kane、AMD、SIGGRAPH 2009」を読んでください。GLSL-140、130、および 120 バージョンをサポートするには、おそらく次のコードをアプリケーションに追加する必要があります。

#version 150 compatibility
于 2011-01-25T12:30:45.903 に答える