2011-09-24 156 views
14

我一直在尋找OpenGL中着色器的示例,並且我已經看到了一些不同的樣式。一些着色器專門使用內置類型(即,gl_Vertex)來傳遞應用程序代碼和着色器之間的數據。OpenGL ES 2.0着色器最佳實踐

一些着色器使用不同的類型將數據從頂點傳輸到片段着色器,而不是使用gl_Position和gl_FragColor。

某些着色器使用前綴「中」和「出」來指定數據傳輸:

in vec3 vertex; 

void main() { 
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0); 
} 

...而其他人使用的屬性:

attribute vec4 vertex_attrib; 
attribute vec4 tex_coord_attrib; 
attribute vec4 color_attrib; 
uniform mat4 mvp_matrix; 
uniform mat4 texture_matrix; 
varying vec4 frag_color; 
varying vec2 tex_coord; 

void main(void) 
{ 
    gl_Position = mvp_matrix * vertex_attrib; 
    vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib; 
    tex_coord = transformed_tex_coord.st/transformed_tex_coord.q; 
    frag_color = color_attrib; 
} 

我的問題是,什麼是GLES 2.0中的首選方法是編寫着色器?是否有最佳實踐指南?有人可以提供一個頂點&片段着色器的例子,這是一個'做什麼'的光輝榜樣?

謝謝。

回答

21
  1. 「ES 2.0」中沒有gl_Vertex。您提供的所有屬性都是自定義的。
  2. gl_Position不是ES 2中的一個選項,但是是一項要求。瞭解OpenGL管道以瞭解原因。提示:僅當光柵化器被禁用時(例如變換反饋),它纔可以是可選的,但ES中不支持這種情況。
  3. 在ES 2.0中,頂點屬性必須具有「屬性」值,變化必須聲明爲「變化」。使用'in'和'out'是一種在OpenGL 3+下開發的習慣,不適用於ES。

最後,您最好的選擇是閱讀Nicol Bolas建議的OpenGL ES 2.0 Specification。規則優先,最佳實踐 - 稍後。祝你好運!

+0

'in'和'out'可以從宏中得到一些幫助。 – user1095108

22

您最大的問題是您正在查看桌面GLSL着色器並試圖弄清楚GLSL-ES的含義。就像OpenGL ES與OpenGL不一樣,GLSL-ES與GLSL不是一回事。自GLSL-ES分拆以來,GLSL在很多年中取得了長足的進步。因此,不能使用作爲實現GLSL-ES着色器的粗略指南,而不是使用桌面GLSL着色器。除了你可以使用C++文本作爲C的指南外。

這些語言非常相似,但桌面GLSL不得不放棄很多GLSL-ES尚未放棄的關鍵字。同樣,老式GLSL(1.20)實現了許多GLSL-ES和更高版本的GLSL,例如內置輸入和輸出。因此,您將看到桌面GLSL着色器的批次,這些着色器將在GLSL-ES上不起作用。事實上,如果你發現有這樣做,那隻會是純粹的意外。

我對GLSL-ES的指南並不瞭解,但最容易找到和使用的是最終資源:The OpenGL ES Shading Language Specification (PDF)。擴展可以強化功能,但PDF定義了核心語言。您的下一個賭注是任何明確標記爲OpenGL ES 2.0特定的材料。

基本上,雖然您可以理解桌面GLSL着色器在做什麼,但如果您正在編寫OpenGL ES 2.0應用程序,最好查看算法而不是語法。

+2

我不是在階段,我在看算法。我只是想了解一個GLSL_ES着色器的一般語法,例如,如果任何人有一個,將是理想的,因爲它比PDF中的頁面更容易學習,有沒有人擁有一個? – MarkP

+3

我通常喜歡示例超過完整的規格,但通過閱讀呃那個特別的PDF對我來說是非常有啓發性的,我也絕對推薦它。 –

2

在Android開發人員OpenGL ES 2.0教程中以及在sdk示例代碼中都有OpenGL ES 2.0的示例代碼。但是,您仍然需要使用人們不斷提及的非常相同的參考文件:「OpenGL ES着色語言規範」來理解示例代碼,因爲Google不會經常解釋他們在做什麼,而且當他們這樣做時,他們並不總是堅持以標準的OpenGL術語。

這就是說,你可能會發現更容易指OpenGL ES 2.0的參考頁在http://www.khronos.org/opengles/sdk/docs/man/,而讀碼。