OpenGL 從入門到成魔-第3章- Shader 和 Program(下)

注:參考自bilibili系列視頻,OpenGL 從入門到成魔-第3章- Shader 和 Program(下)https://www.bilibili.com/video/BV1dt4y1C7Sz

頂點(diǎn)輸入轉(zhuǎn)換為屏幕輸出流程 (渲染管線)

image

1.頂點(diǎn): 位置、顏色等信息
2.頂點(diǎn)著色器(Vertex Shader):頂點(diǎn)的變換,每個頂點(diǎn)都執(zhí)行一次shader
注:頂點(diǎn)著色器的 每個輸入變量也叫頂點(diǎn)屬性(Vertex Attribute)。我們能聲明的頂點(diǎn)屬性是有上限的,它一般由硬件來決定。OpenGL確保至少有16個包含4分量的頂點(diǎn)屬性可用,但是有些硬件或許允許更多的頂點(diǎn)屬性。
3.圖元裝配:頂點(diǎn)--》圖形
4.幾何著色器:目前沒用到
5.光柵化:圖形--》像素?cái)?shù)據(jù),在片段著色器運(yùn)行之前會執(zhí)行裁剪:丟棄超出視圖以外的所有像素,用來提升執(zhí)行效率。

光柵化.png

  1. 片段著色器(Fragment Shader):計(jì)算每個像素的最終顏色,有多少像素,就執(zhí)行幾次。這也是所有OpenGL高級效果產(chǎn)生的地方。
  2. 測試與混合
  3. 參考圖片


    image.png

寫shader時(shí)的小技巧

由于c++里直接寫字符串,會很麻煩,不停的換行,讀起來也不清晰,我們可以用以下方法寫shader

  1. 文件開頭定義兩個宏
    #define STRINGIZE(x) #x
    #define SHADER(shader) "" STRINGIZE(shader)
  1. 使用,注:SHADER( )括號內(nèi)需要手動換行
   //頂點(diǎn)著色器 
   char* vertexShaderStr = SHADER(
      #version 330\n
        layout(location = 0) in vec3 pos;
        out vec3 outPos;
        void main()
        {
            outPos = pos;
            gl_Position = vec4(pos, 1.0);
        }
    );
  
    //片段著色器
    char* fragmentShaderStr = SHADER(
        #version 330\n

        out vec4 rgbaColor;
        in vec3 outPos;
        void main()
        {
            rgbaColor = vec4(outPos, 1.0);
        }
    );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容