2014-01-18 88 views
1

我正在使用GPUImage框架處理iOS項目。我無法讓我的着色器編譯。使用GPUImage在OpenGL ES着色器中使用bool返回類型的函數


有一個在我的片段着色器的功能:

const vec2 boundMin = vec2(0.0, 0.0); 
const vec2 boundMax = vec2(1.0, 1.0); 

bool inBounds (vec2 p) { 
    return all(lessThan(boundMin, p)) && all(lessThan(p, boundMax)); 
} 

着色器編譯日誌:

ERROR: 0:1: '_Bool' : syntax error syntax error 

當我更換所有的調用函數

inBounds(vec2 p)

all(lessThan(boundMin, p)) && all(lessThan(p, boundMax))

它的工作原理太棒了!


問題:

是在OpenGL ES 2.0的片段着色器支持布爾函數?如果是這樣,我哪裏出錯了?如果不是,爲什麼這兒有功能,如all()lessThan()

環境:iPad的迷你,的iOS 7,OpenGL ES 2.0的時,Xcode 5.0.2

+0

你可以顯示整個着色器嗎?如果我正確地閱讀了該編譯日誌,那是抱怨第一行。 –

+0

@ AndonM.Coleman我不認爲這是第一行,因爲當我刪除'inBounds'函數時,它工作正常。我相信這是導致問題的功能本身。你使用GPUImage嗎?我不認爲GPUImage的着色器編譯日誌可以給出錯誤的確切位置。 – YuAo

+0

0:1通常意味着第1行中第一個字符的作用。每個供應商都不相同,但這往往是約定。 –

回答

5

我終於弄明白!

GPUImage使用SHADER_STRING()來分析着色器。

當我編寫bool時,LLVM Objective-C編譯器不知道這些代碼將被轉換爲着色器字符串。當編譯器看到bool時,它將用_Bool代替bool,因爲在Objective-C bool中定義爲_Bool

+2

這不僅僅是Objective-C,它是C99,它使用一個編譯器宏來實現:http://stackoverflow.com/a/8724376/19679。我使用宏而不是字符串作爲片段着色器(以避免換行並允許一些語法突出顯示)將它們打開。可能會有副作用,但您可以在着色器定義之前嘗試'#undefine bool'。我會在文檔中註明這一點。 –

相關問題