OpenGL學習筆記《三》簡單的shader

  前面的文章中有提到,要繪製出簡單的圖形,咱們須要提供頂點着色器和片斷着色器。在前面繪製三角形和矩形的過程當中,頂點着色器處理了咱們輸入的頂點座標數據,而後片斷着色器是固定輸出了顏色。git

  如今,咱們經過必定的方法,讓片斷着色器能夠輸出不一樣的顏色,這個方法就是藉助:uniform關鍵詞。github

  在片斷着色器中,咱們將在變量聲明前面加上uniform關鍵詞,就能在外部調整這個變量的值,從而影響到着色器程序的運行效果:函數

const char* fragmentShaderSource = "#version 330 core\n"
        "out vec4 FragColor;\n"
        "uniform vec4 u_color;\n"
        "void main()\n{"
        "    FragColor = u_color;\n"
        "}\0";

  上述片斷着色器代碼中,u_color變量前面加上了uniform關鍵詞,而後將這個變量賦值給FragColor,這樣片斷着色器輸出的顏色,就由u_color的值決定。this

  那麼如何給uniform聲明的變量賦值?spa

  首先,咱們須要找到這個變量的索引:code

glGetUniformLocation(shaderProgram2, "u_color")

  glGetUniformLocation方法,參數1爲咱們建立的着色器程序的索引ID,參數2爲uniform變量的名字,該方法返回該變量的索引,若是返回的是-1,說明該變量不存在。orm

  獲取到了位置以後,咱們就能夠給該變量賦值了:blog

glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);

  由於opengl是c實現的,沒有函數的重載功能。可是咱們知道變量有多種類型,像float、int等,因此只能建立各類命名爲glUniformxxx的函數,來針對各類不一樣類型的變量進行賦值處理,在這裏咱們的uniform變量的類型是vec4,即4個浮點類型的數據,因此咱們用到的函數是glUniform4f,參數1是咱們前面找到的變量地址,後面4個值就對應vec4的4個值了。索引

  要使咱們的賦值生效,咱們須要在調用賦值方法以前,先調用glUseProgram方法。rem

  另外須要注意的是,若是咱們在着色器代碼中聲明瞭uniform類型的變量,可是在代碼中又沒有用到這個變量,那麼着色器編譯的時候就會去掉這個變量,就致使咱們在想改變這個變量值的時候,發現改變不了。這個是須要咱們注意的。原文做者的話是:If you declare a uniform that isn't used anywhere in your GLSL code the compiler will silently remove the variable from the compiled version which is the cause for several frustrating errors; keep this in mind! 我以爲應該就是我說的意思。

  對應的代碼在這裏

相關文章
相關標籤/搜索