注:參考自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
- 片段著色器(Fragment Shader):計(jì)算每個像素的最終顏色,有多少像素,就執(zhí)行幾次。這也是所有OpenGL高級效果產(chǎn)生的地方。
- 測試與混合
-
參考圖片
image.png
寫shader時(shí)的小技巧
由于c++里直接寫字符串,會很麻煩,不停的換行,讀起來也不清晰,我們可以用以下方法寫shader
- 文件開頭定義兩個宏
#define STRINGIZE(x) #x
#define SHADER(shader) "" STRINGIZE(shader)
- 使用,注: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);
}
);
