2015-02-24 58 views
0

我最近開始學習opengl,但仍然不太瞭解它。我下面的教程,寫了這兩種着色器:OpenGL Shader編譯在桌面上,但不是Android

頂點着色器:

#version 400 

in vec4 s_vPosition; 
in vec4 s_vColor; 
out vec4 color; 

void main() { 
    color = s_vColor; 
    gl_Position = s_vPosition; 
} 

片段着色器:

#version 400 

in vec4 color; 
out vec4 fColor; 

void main() { 
    fColor = color; 
} 

他們蒐集和工作用OpenGL 3在桌面上就好了,但不要在Android上不能與OpenGL ES 2進行編譯。我試着檢查着色器輸出日誌,但它返回一個空白字符串。再一次,我對此很新,我的錯誤可能非常簡單,但任何幫助都將受到高度讚賞。

+1

不,那些着色器在GL3下將無法正常工作。如果他們這樣做了,那麼通過一個非常優秀的實現就是如此。那些着色器需要GL 4.0(儘管沒有特別的原因,如果選擇更合理的版本,他們可以使用3.x)。然而,在任何情況下,這些着色器都不適用於ES2,它使用不同的語法(與GLSL 1.20兼容),因此更改版本無濟於事。 – derhass 2015-02-24 00:28:17

+0

那麼我能做些什麼來使它工作? – 2015-02-24 00:30:00

+0

沒關係,samgak的答案有效。 – 2015-02-24 01:48:42

回答

4

在OpenGLES2中,您不使用像3.0中那樣的inout變量前綴。相反,您使用以下關鍵字:

  • 屬性被傳遞給每個頂點
  • 頂點着色器不同的是從頂點着色器傳遞到片段着色器
  • 均勻價值觀您可以在着色器上爲所有頂點和片段設置全局變量(包括紋理等,但也可以是標量或矢量類型)。

attribute對應於頂點着色器中的in。 A varying對應於頂點着色器中的out和片段着色器中的in。所以,你的頂點着色器改成這樣:

attribute vec4 s_vPosition; 
attribute vec4 s_vColor; 
varying vec4 color; 

void main() { 
    color = s_vColor; 
    gl_Position = s_vPosition; 
} 

和你的片段着色器這樣的:

varying vec4 color; 

void main() { 
    gl_FragColor = color; 
} 

gl_FragColor就像gl_Position特別定義的變量用於從片段着色器輸出的顏色。

+0

非常感謝!這工作!我的感謝無法用言語表達。現在我可以繼續學習OpenGL了。 – 2015-02-24 01:47:39

相關問題