2012-11-06 39 views
1

我的問題與使用相同數據的多個着色器文件有關。openGL着色器共享變量

我知道你可以在directX,但你可以在openGL?

例如

vertexShader1可能需要知道我的cameraViewProjection vertexShader2可能需要以及

SOOOO是有辦法我只能

「的#include」 共享變量文件?

一樣,如果我想使所謂的「ShaderedVariables」另一個文件的,我可以把我的 世界信息有像cameraView或ViewProjection

我一直在到處找,但我仍然不知道這是可能的或不。

+0

簡單地「包含」另一個文件是不可能的--GLSL編譯器沒有文件或包含的概念。不過,我發現至少有一種方法可以完成幾乎相同的事情。請參閱http://stackoverflow.com/questions/10754437/how-to-using-the-include-in-glsl-support-arb-shading-language-include。 –

回答

3

OpenGL不知道如何使用文件系統。它不知道的一個文件系統。所以它無法讀取文件。

您可以嘗試ARB_shading_language_include(這也不會讀取文件;它使您在內存中構建文件系統)。但現在,似乎只有NVIDIA支持它,所以它不是最便攜的解決方案。

在一般情況下,如果定義小而少,你只要把同樣的東西到每個着色器文件:

// Shader1: 
uniform mat4 cameraMatrix; 
void main() {...} 

// Shader2: 
uniform mat4 cameraMatrix; 
void main() {...} 

如果你的定義是較大幅度的,你總是可以建立自己的系統包括。請注意,glShaderSource需要多個字符串,而不只是一個。因此,您可以簡單地使用常用定義爲主着色器字符串加上前綴,並讓每個實際着色器選取它們實際使用的着色器。

+1

+1用於構建您自己的系統。這非常簡單,您可以根據需要進行設置。如果你想加入常用的制服,你可以。如果您希望在着色器開始處具有指向不同系列制服的特定關鍵字,則可以。該系統是您的,您可以根據自己的需求定製功能。另外,不要太擔心只包括必要的制服,GLSL編譯器通常非常擅長清除未使用的制服。 –

+0

雖然你回答說glShaderSource需要多個字符串,但這些信息很容易被忽略。我建議你更強調這一點。理想情況下,自己的一個小例子。 – datenwolf