# OpenGL
- Texture Filtering:為了將 Texture 畫上模型,必須把 Texture Pixel 要被映射到三角形的每個 Pixel 中,然而 Texture 的 Pixel 數量通常和三角形的並不一致,這就需要在 Texture 上取某些顏色做平均或是選擇,這插值的選擇方式就是 Texture Filtering,通常有 Nearest Neighbor Interpolation、Linear Interpolation 等方式
- Texture Units:每個 Texture Unit 可以綁定一個 Texture ,並在渲染過程中對其進行設設定和使用,Texture Unit 具有獨立的狀態和設定,包括紋理的綁定、Filtring 的方式等,在 Pipeline 的 Fragment Shader 階段,Shader 可以根據需要從特定的 Texture Unit 中讀取Texture ,並將其應用到渲染的結果中
- Euler Angles:被定義為 Pitch、Yaw、Roll,從而允許我們通過這三個值建立任何 3D 的旋轉方向
- LOD Level of Detail:指 Mipmap 的細節層級
- OIT Order-independent transparency 距離無關透明
- Silhouette 輪廓
- PCG Procedural Content Generation 使用演算法而非直接手動的方式建模,例如長滿草地的地形
- Curvature 曲率
- IBL image based lighting
### OpenGL Shader Compile
由 CPU 編譯:https://stackoverflow.com/questions/7212231/are-opengl-shaders-compiled-on-the-gpu-or-the-cpu-how-does-binary-output-vary-b
### fwidth
螢幕座標點的梯度的絕對值,等於 abs(dFdx(x)) + abs(dFdy(x)),另外 DirectX 的 ddx, ddy 就是 GLSL 的 dFdx, dFdy
http://www.bimant.com/docs/glsl-es/fwidth/
### fract
等同於 x - floor(x)

### Fixed Point
https://inst.eecs.berkeley.edu/~cs61c/sp06/handout/fixedpt.html
### OpenGL DirectX Vulkan 專有名詞比較
https://www.cnblogs.com/straywriter/articles/15872554.html
### VAO 與 EBO 的互動
綁定 VAO 後又綁定 EBO,並且沒解除的情況下,這個 VAO 就與 EBO 關聯上了,然後如果切換到其他的 VAO、EBO 後又綁定回 VAO,則也會自動綁定該 VAO 原先指向的 EBO,因此可以用以下方式檢查 VAO 是否綁定到了 EBO
```cpp
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 获取当前绑定到GL_ELEMENT_ARRAY_BUFFER目标的缓冲对象ID
GLint eboBinding;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &eboBinding);
if (eboBinding == 0) {
std::cout << "VAO is not bound to EBO" << std::endl;
} else {
std::cout << "VAO is bound to EBO" << std::endl;
}
```
但最好還是使用 OpenGL DSA,此外 VAO 可以綁定到多個 VertexBuffer,因此 DSA 下 vao 除了有 attribute index,也有 buffer index
### OpenGL Opaque Type 是甚麼?
Opaque Type
### GL_DEBUG_OUTPUT_SYNCHRONOUS
GL_DEBUG_OUTPUT_SYNCHRONOUS
If enabled, debug messages are produced synchronously by a debug context. If disabled, debug messages may be produced asynchronously. In particular, they may be delayed relative to the execution of GL commands, and the debug callback function may be called from a thread other than that in which the commands are executed.
### glFlush and glFinish
- glFlush:清空指令 Buffer,馬上將指令送到 GPU,但是指令傳送過去後立即返回,不會等待指令執行完畢,這些指令會在有限時間內執行完畢
- glFinish:將指令 Buffer 中的指令立刻送到 GPU 執行,但要等到執行完以後才繼續執行

### OpenGL DSA
原本要操作特定的 Object 要透過 State Machine 層來修改,即先 Bind 再修改,但 4.5 改版以後變成可以直接針對 Object 做操縱,也就是說 4.5 以後提供了許多函數是直接針對 object 做操作,而不是 target
此外,由於 DSA 是直接針對物件操作,因此不會更改 Context
### h3

### Difference Between glCreate* and glGen*
glGen 只是給尚未使用的 ID,Gen 以後即使返回 id,這 id 所對應的物件仍尚未建立,但 Create 則是產生出 ID 以後也已經建立 object
### Column Major 與 Row Major 的差異?
陣列儲存資料的方式是以數學矩陣 Column 的順序依序儲存,即 Mat[0][0]~Mat[0][3] 儲存了數學矩陣中的第一個 Column,反之為 Row Major,OpenGL 預設是 Column Major
註:M 為矩陣,v 為向量,Glm 支持 M * v 即 v * M 兩種操作,就分別為 Column Major 以及 Row Major
### Point Size 的單位
OpenGL Point Size 單位是螢幕的 Pixel 嗎
### Difference Betweem Displacement Mapping amd Bump(Normal) Mapping
- Displacement Mapping:使用 Texture 上的資訊真的移動頂點
- Bump(Normal) Mapping:
### GLSL varying 等同於 in/out,但為何棄用?attribute 又是甚麼意思?
註:在舊版 GLSL 中 attribute 用於修飾頂點資料,只能用在 VertexShader
https://stackoverflow.com/questions/34627576/why-did-glsl-change-varying-to-in-out
### Material 的定義
一个物体反射的环境光,漫反射,镜面光颜色。这些东西设定了物体所拥有的颜色
Material 的主要屬性包括:
- 漫反射(Diffuse Reflection):描述物體表面對光源發生的漫射反射,即光在各個方向上均勻地散射
- 鏡面反射(Specular Reflection): 描述物體表面對光源發生的鏡面反射,即光在特定方向上反射,形成高光區
- 環境反射(Ambient Reflection): 描述物體表面對環境光的反射,即光在所有方向上均勻地反射,不受入射光源方向的影響
- 折射(Refraction): 描述光在物體表面進入或離開時的折射行為,即光線經過介質界面時的偏折
- 透明度(Transparency): 描述物體對光的透明程度,即光是否能夠穿透物體。
- 色彩(Color): 描述物體對不同波長的光的吸收和反射,影響物體的色彩
- 紋理(Texture): 描述物體表面的紋理和圖案,以影響物體的視覺外觀
### 紀錄
- Directx ddx 等同於 glsl dFx
- Hint 是用於提示 OpenGL 執行的一種機制,它讓我們向 OpenGL 提供關於期望的行為或性能偏好的提示,以幫助 OpenGL 優化其操作,主要用於以下兩個方面:
- 預測性能優化:OpenGL的實現可以根據開發者提供的 Hint 來進行性能優化,這些提示可能是關於數據存取的頻率等等,根據這些提示,OpenGL 可以調整其內部算法和 Cache 的方式,以達到更高的性能,例如,我們可以通過 Hint 指定某個緩衝區的使用頻率是一次性的,讓OpenGL在處理該緩衝區時選擇更高效的內存存儲方式。
- 行為控制:OpenGL 可根據提供的 Hint 來調整其行為,這些提示可能關於到圖片解析度、過濾方式、渲染順序等,根據這些提示,OpenGL可以改變其內部的默認行為,以滿足開發者的需求,例如我們可以通過提示 OpenGL 進行圖像壓縮時使用較高解析度的壓縮算法,以獲得更好的視覺效果
- Texture 綁定:genTextures 生成 Texture,並且在使用 glTexImage2D 後將資料傳入,而此時圖片此時已經在 VRAM 中,這時候用 glActiveTexture(GL_TEXTURE0 + slot) 開啟槽位,再使用 glBindTextureUnit(slot, id) 將特定 Texture 綁定到某個槽,最後則是將槽位綁定到 shader 中的 uniform 上,則是使用 glUniform1f 指定槽位 id
- GLSL 用 layout 可以讓 vs 的輸出變數名稱與 fragment 的輸入名稱不一樣
- glTexImage Internal Format 與 Format 的差異:Format 代表如何解讀從 DRAM 取得到的記憶體格式,Interenal Format 以何種格式儲存到 VRAM,中間可能會經過轉型、調整間距
- 少用 glm::LookAt 改用 LookAtRH、LookAtLH
https://www.bilibili.com/video/BV1ZE411F7kW?p=7&vd_source=fe0a19eb825da1e240222c106c8ac793
DoxyGen Class、Function 的用途以及其 Param、Member 應該寫在 Header,比較細節的實作 Note 則該寫在 Cpp,總之,不常更改的應該要放在 Header,會隨著實作頻繁改變的則應該放在 Cpp 中
focal length 焦距
凹凸多邊形的定義:凸多边形指所有的頂點連線必定都不與邊相交,反之凹多邊形
simple Polygon、non simple polygon 的定義:所有的邊都不相交,反之是 non simple polygon
Wavefront .obj file 格式
- HDR(High Dynamic Range, 高动态范围)
- LDR(Low Dynamic Range,低动态范围)
抗鋸齒介紹文章:https://www.zhihu.com/question/20236638/answer/14438218

如果一個屬性,它的 GL_VERTEX_ATTRIB_ARRAY_DIVISOR 不等於零,就稱作 instanced
wavefront 格式:face 第一個放 vertices position array 的 index,第二個放 uv array 的 index,第三個放 normal array 的 index
物体轮廓理解:
1、开启并设置模板测试条件为:总是通过测试,即本次绘制的所有片段都会通过测试并更新模板值;
2、绘制物体并更新模板值;
3、禁用模板缓冲写入;
4、修改模板测试条件:没有模板值得片段才通过测试,意味着这次绘制会丢弃掉之前绘制的物体区域(并不影响上次的绘制,只会影响接下来的绘制)
Scissor Test

https://registry.khronos.org/OpenGL-Refpages/gl4/html/glEnableVertexAttribArray.xhtml
https://zh.wikipedia.org/zh-tw/%E5%8D%8A%E7%B2%BE%E5%BA%A6%E6%B5%AE%E7%82%B9%E6%95%B0

3D 中的旋轉,是需要旋轉軸 以及 旋轉角度的,但在 2D 中我們只需旋轉角度即可,因為旋轉是在平面上做,2D 本身只有一個平面,但 3D 則是相當於不同方向可以構成無數個平面,因此需要一個旋轉軸,也就是旋轉平面的法向量,來特指我要以哪個平面進行旋轉
Gimbal Lock 是甚麼?Quatarnion 是甚麼?
測試 Map 的使用
練習9:粒子爆炸
練習15:劃出甜甜圈

### glTexImage glTexStorage 的差異?
https://www.khronos.org/opengl/wiki/Texture_Storage#Automatic_mipmap_generation
### 透視矩陣重心座標矯正
https://zhuanlan.zhihu.com/p/144331875
https://www.zhihu.com/people/sun-lei-22-19/posts?page=1
block 可以用在 uniform in out


std 140 假設 N = 4
重點是標量與 vector 的陣列變成都以 vec4 的基數為準




glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

从本地内存向GPU的传输(UNPACK)从GPU到本地内存的传输(PACK)
40 頁 in(default)、const in、out、inout
GLSL precies invariant 的差異?
UBO 教學:index 與 location 不一樣:index 用來查資訊,location 用來塞資料https://stackoverflow.com/questions/16302276/difference-sbetween-uniform-location-and-uniform-index
https://blog.csdn.net/super_guan/article/details/110704181
buffer 與 uniform 的差異
使用 Query 再 DepthTest Disable 的情況下看畫出多少的 Pixel
### Depth Test、Depth Prepass
Depth Test 是在 Fragment Shader 以及 Stencil Testing 之後才執行
但這樣的順序效率太低,現在大部分的 GPU 都提供提前深度測試(Early Depth Testing)的功能,它反而是在 Fragment Shader 前執行,只要發現它沒通過就可以提前 Discard 這個 Fragment,而省下 Fragment Shader 計算的開銷(Fragment Shader 通常運算量很大很吃資源)
但如果一個 Fragment Shader 對它的 Depth 進行改寫,提前深度測試就是不可能的,因為無法提前知道深度值
### Stencil Test
# Compute Shader
Stream Processor:A stream processor uses a function/kernel (e.g. a fragment Shader) to run over a set of input records/stream (e.g. fragments) to produce a set of output records (pixels for the final image) in parallel. Due to the parallel execution, each element is processed independently, without any dependencies between elements.

Work Group:Computer Shader 可以想成是一堆小小的電腦,稱作 Work Groups,而這堆小電腦是以三維陣列的形式組成一個整體,我們可以透過 glDispatchCompute(x, y, z),決定這個 Group 長寬高的數量,Work Groups 的總數量就是 x * y * z,下圖中每個綠色方格就是一個 Work Group 這些 Work Group 彼此無法通訊,完全都是各自獨立運行

Invocation:Work Group 裡面又含有許多 Thread,稱作 Invocation,他們同樣以三維的形式組成,不同於 Group,在這些 Invocation 內彼此是能互相通訊的,下圖每個紅色小方形就是一個 Invocation

Local Size:又稱作 Work Group Size,表示一個 Work Group 裡面有多少個 Invocation(不是代表共有多少個 Work Groups!),在 Shader 中以 layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in; 指定
計算一個 Compute Shader 所含有的 Invocation 的數量:給定一個 Compute Shader 的 Local Size 為 (128, 1, 1),Work Groupo 數量為 (16, 8, 64) ,則 128 * 1 * 1 * 16 * 8 * 64 = 1,048,576,這個 Compute Shader 會一次使用 1,048,576 個 Invocation
WARP:又稱作 Wavefront,每個 GPU 廠商都會優化特定大小的 Work Group Size,要達到最好的效率,就必須使用該大小的 Work Group Size,這就稱作 WARP
Work Group Limitation:能用的 Work Groups 數量是有限的,OpenGL 中以 GL_MAX_COMPUTE_WORK_GROUP_COUNT 定義,以 glGetIntegeri_v 取值,回傳一個三維向量代表 x, y, z 的最大數目
Local Size Limitation:每個 Work Group 所能用的 Invocation 數量同樣也有限制,OpenGL 中以 GL_MAX_COMPUTE_WORK_GROUP_SIZE 定義,
GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS.
GL_MAX_COMPUTE_WORK_GROUP_SIZE and another limitation of the total number of invocations within a work group, which is that the product of the X, Y and Z components of the local size must be less than
Memory Barrier:
No Input and Output:Vertex Shader 有 User Defined Input Output,分別用 in, out 表示,但 Computer Shader 並沒有這東西,但 Computer Shader 仍有 Input Output,只是不是 User Defined 罷了,共有以下這五個
- gl_NumWorkGroups:一個三維向量,表示這個 Compute Shader 有多少個 Work Groups,即 glDispatchCompute 所設定的
- glWorkGroupSize:一個三維向量,表示這個 Work Group 含有多少個 Invocation,由 layout 所定義的
- gl_WorkGroupID:一個三維向量,表示我目前在哪個 Work Group
- gl_LocalInvocationID:一個三維向量,表示我是哪個 Invocation
- gl_GlobalInvocationID:一個三維向量,不同的 Work Group 內會有同編號的 Invocation ID,因此仍然無法唯一表示這個 Invocation,必須要 WorkGroup ID 以及 LocalInvocationID 一起看才能表示出整個 Compute Shader 內任意 Invocation 的 Unique ID,ID 運算公式如下:gl_GlobalInvocationID = gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID
- gl_LocalInvocationIndex:一個純數值,以 1d 的形式表達 gl_LocalInvocationID,編號方式先以 z 切成平面,再以 y 切成一條條,最後以 x 編號

Shared Variable:每個 Work Group 裡面的 Invocation 彼此可以互相共用同一個變數,以 shared 開頭來宣告,例如 shared int i;

# Tessellation Shader
### Patch 是甚麼
Tessellation Shader 之間的處理是以 Patch 為單位,一個 Patch 是以多個頂點組成的,以 glPatchParameteri 設定,最多可以有 GL_MAX_PATCH_VERTICES 個,且事實上,Patch 就相當於 Compute Shader 的 Work Group 一樣,內部的 Vertices 資訊是共享的,但不同 Patch 則是互相獨立、平行地執行的
### Patch 與 Work Group 的比較
- Patch:
- 每個 Patch 有多個 Vertices
- Shader 對每個 Vertex 都跑過一次
- Patch 無法與其他 Patch 交換任何資訊
- Vertices 在 Patch 之中可以交換資訊
- Work Group
- 每個 Work Group 有多個 Invocation
- Shader 對每個 Invocation 都跑過一次
- Work Group 無法與其他 Work Group 交換任何資訊
- Invocation 在 Work Group 之中可以交換資訊
### Patch 不等於 Primitive
如果輸入是以三角形作為 Primitive,不代表 Patch 必定是以三個為一組,我可以 Primitive 是三角形,但 Patch 超過 3 個
### Tessellation Control Shader
Tessellation Control Shader 階段要確定要進行多少曲面細分,具體如何完成需要以下三步驟:
1. 指定每個 Patch 的 Vertices 數量
2. 對 Patch 的每個頂點執行任何變換
3. 指定要執行的曲面細分等級,它控制要執行的曲面細分程度
當指定每個 Patch 的頂點數時,該值需要與 CPU 上使用 glPatchParamteri 所指定的數量相符,這是透過 layout out 來完成的
```cpp=
layout (vertices=4) out; // vertices 指定的值必須要等於 glPatchParameteri 指定的數量
```
該階段擁有三個 GLSL 提供的參數:
- gl_PatchVerticesIn:一個 int 值,每個 Patch 有多少個 Vertices
- gl_PrimitiveID:一個 int 值,我是第幾個 Patch
- gl_InvocationID:一個 int 值,我是這個 Patch 的第幾個 Vertex
### Tessellation Engine
Control Shader 已經產生一堆 Patch 了,也設定好了細分的疏密程度,在這階段會依照細分的程度產生許多 Intermediate Points
### Tessellation Evaluation Shader
輸入需要三個參數,例如 layout(triangle, fractional_odd_spacing, cw)in
- 第一個參數代表 Evaluation Shader 計算出重心座標的方式,可為 isolines, triangles, quads
- 第二個參數代表空間分配方式,即決定 TessLevelInner 跟 gl_TessLevelOuter 的小數如何分配
- 第三個參數表示頂點排序的方向
### Hull Shader and Domain Shader
- Direct3D 中的 Hull Shader 等同於 OpenGL 的 Tessellation Control Shader
- Direct3D 中的 Domain Shader 等同於 OpenGL 的 Tessellation Evaluation Shader
### Patch Division
利用 Patch 內的 Vertices 產生更多的 Vertices,產生出的 Vertices 分為兩類,且數量可以自己設定:
- Inner:
- Outer:
### 計算機結構
考慮比較簡單的情況,假設說我們希望 CPU 要取 RAM 的時候會馬上切換到之後的指令運算,但如果 RAM 存取太多次,會導致其他沒指令能計算了,那 RAM 存取就會造成 CPU Idle,因此我們希望 CPU 與 RAM 存取佔整個程式一定的比例,不能太多
https://www.bilibili.com/video/BV17X4y1k7eF/?spm_id_from=333.788&vd_source=fe0a19eb825da1e240222c106c8ac793
測試球體的 Gouraud Shading
### What is RenderBuffer
### in, const in, out, inout
### GLSL
- fract(x):取得 x 的小數點後的部分,可用 fract(x * 10) 來取得小數點後一位後的部分
- step(g, x):如果 g > x 輸出 0,否則輸出 1
Textures
(已完成)glActiveTexture
glBindImageTexture
glBindImageTextures:一次綁定一堆 Textures 到連續的 Texture Units 中
(已完成)glBindTexture
(已完成)glBindTextureUnit:直接把 Texture 綁定到特定 unit 並且開啟
(已完成)glBindTextures
glClearTexImage
glClearTexSubImage
glCompressedTexImage1D
glCompressedTexImage2D
glCompressedTexImage3D
glCompressedTexSubImage1D
glCompressedTexSubImage2D
glCompressedTexSubImage3D
glCopyImageSubData
glCopyTexImage1D
glCopyTexImage2D
glCopyTexSubImage1D
glCopyTexSubImage2D
glCopyTexSubImage3D
(已完成)glCreateTextures
(已完成)glDeleteTextures
(已完成)glGenTextures
glGetCompressedTexImage
glGetCompressedTextureSubImage
glGetTexImage
glGetTexLevelParameter
glGetTexParameter
glGetTextureSubImage
glInvalidateTexImage
glInvalidateTexSubImage
(已完成)glIsTexture
glTexBuffer
glTexBufferRange
(已完成)glTexImage1D
(已完成)glTexImage2D
glTexImage2DMultisample
glTexImage3D
glTexImage3DMultisample
(已完成)glTexParameter
glTexStorage1D
(已完成)glTexStorage2D:分配 Texture 的記憶體空間但不輸入資料
glTexStorage2DMultisample
glTexStorage3D
glTexStorage3DMultisample
glTexSubImage1D
glTexSubImage2D
glTexSubImage3D
glTextureView
Rendering
(已完成)glClear:指定要清除哪些 Buffer
(已完成)glClearBuffer:指定清除當下 FBO 的哪種 Buffer,以及清除的值為何,而一個 FBO 可以有多個 Color Attachment,因此該函數有提供參數可選擇要清除哪個編號的 Color Attachment
(已完成)glClearColor:指定 Color Buffer 清除後的值
(已完成)glClearDepth:指定 Depth Buffer 清除後的值
(已完成)glClearStencil:指定 Stencil Buffer 清除後的值
glDrawBuffer
(已完成)glFinish:將指令立即送到 GPU 並且等待執行完後才繼續
(已完成)glFlush:將指令立即送到 GPU 但不等待執行完
glReadBuffer
(已完成)glReadPixels:從左下角開始讀取一個區塊的像素的顏色
Frame Buffers
(已完成)glBindFramebuffer
(已完成)glBindRenderbuffer
glBlitFramebuffer
(已完成)glCheckFramebufferStatus
(已完成)glCreateFramebuffers
(已完成)glCreateRenderbuffers
(已完成)glDeleteFramebuffers
(已完成)glDeleteRenderbuffers
glDrawBuffers
glFramebufferParameteri
glFramebufferRenderbuffer
(已完成)glFramebufferTexture
glFramebufferTextureLayer
(已完成)glGenFramebuffers
(已完成)glGenRenderbuffers
(已完成)glGenerateMipmap:幫指定紋理物件產生 Mipmap
glGetFramebufferAttachmentParameter
glGetFramebufferParameter
glGetRenderbufferParameter
glInvalidateFramebuffer
glInvalidateSubFramebuffer
(已完成)glIsFramebuffer
(已完成)glIsRenderbuffer
glRenderbufferStorage
glRenderbufferStorageMultisample
glSampleMaski
Shaders
(已完成)glAttachShader
glBindAttribLocation
glBindFragDataLocation
glBindFragDataLocationIndexed
(已完成)glCompileShader
(已完成)glCreateProgram
(已完成)glCreateShader
(已完成)glCreateShaderProgram
(已完成)glDeleteProgram
(已完成)glDeleteShader
(已完成)glDetachShader
glGetActiveAtomicCounterBufferiv
glGetActiveAttrib
glGetActiveSubroutineName
glGetActiveSubroutineUniform
glGetActiveSubroutineUniformName
(已完成)glGetActiveUniform:使用 uniform 的 index 取得該 uniform 的相關資訊
(已完成)glGetActiveUniformBlock:使用 uniform block 的 index 取得該 uniform block 的相關資訊
glGetActiveUniformBlockName
glGetActiveUniformName
glGetActiveUniformsiv
glGetAttachedShaders
(已完成)glGetAttribLocation:取得 vertex shader input 的 location
glGetFragDataIndex
glGetFragDataLocation
(已完成)glGetProgram
glGetProgramBinary
(已完成)glGetProgramInfoLog
glGetProgramResource
glGetProgramResourceIndex
glGetProgramResourceLocation
glGetProgramResourceLocationIndex
glGetProgramResourceName
glGetProgramStage
(已完成)glGetShader
(已完成)glGetShaderInfoLog
glGetShaderPrecisionFormat
glGetShaderSource
(已完成)glGetSubroutineIndex:取得想使用的函數的 index,用 glUniformSubroutineuiv 來給 subroutine uniform 指定要使用的函數
(已完成)glGetSubroutineUniformLocation:取得 subroutine uniform 的 location
glGetUniform
(已完成)glGetUniformBlockIndex:取得 uniform block 的 index
(已完成)glGetUniformIndices:取得 uniform 的 index
(已完成)glGetUniformLocation
glGetUniformSubroutine
(已完成)glIsProgram
(已完成)glIsShader
(已完成)glLinkProgram
glMinSampleShading
glProgramBinary
glProgramParameter
glProgramUniform
glReleaseShaderCompiler
glShaderBinary
(已完成)glShaderSource:把 Shader 原始碼傳給 Shader 物件
glShaderStorageBlockBinding
(已完成)glUniform:把值傳到 Program 的 Uniform 中
(已完成)glUniformBlockBinding:把uniform block 的 index 綁到 binding 上
glUniformSubroutines
(已完成)glUseProgram
glUseProgramStages
glValidateProgram:檢查程式中包含的可執行檔是否可以在目前的 OpenGL 狀態的情況下執行,驗證過程產生的資訊將儲存在程式的 Log 中
Buffer Objects
(已完成)glBindBuffer
(已完成)glBindBufferBase:把 buffer(ex UBO)綁定到某個 binding point 上
(已完成)glBindBufferRange:用途與 Base 一樣,但可以設定要 binding 的資料的偏移量及大小,也就是只把 ubo 中特定區塊資料 bind 到 binding point 上
glBindBuffersBase
glBindBuffersRange
glBindVertexBuffer
glBindVertexBuffers
(已完成)glBufferData
(已完成)glBufferStorage
(已完成)glBufferSubData:不分配空間,把 Buffer 中的一些資料取代
glClearBufferData
glClearBufferSubData
(已完成)glCopyBufferSubData:複製 Buffer 的資料到另一個 Buffer
(已完成)glCreateBuffers
(已完成)glCreateVertexArrays
(已完成)glDeleteBuffers
(已完成)glDisableVertexAttribArray
(已完成)glDrawArrays
glDrawArraysIndirect
glDrawArraysInstanced
glDrawArraysInstancedBaseInstance
(已完成)glDrawElements
glDrawElementsBaseVertex
glDrawElementsIndirect
glDrawElementsInstanced
glDrawElementsInstancedBaseInstance
glDrawElementsInstancedBaseVertex
glDrawElementsInstancedBaseVertexBaseInstance
glDrawRangeElements
glDrawRangeElementsBaseVertex
glEnableVertexAttribArray
glFlushMappedBufferRange
(已完成)glGenBuffers
glGetBufferParameter
glGetBufferParameteriv
glGetBufferPointerv
glGetBufferSubData
glGetVertexArrayIndexed
glGetVertexArrayiv
glGetVertexAttrib
glGetVertexAttribPointerv
glInvalidateBufferData
glInvalidateBufferSubData
(已完成)glIsBuffer
(已完成)glMapBuffer
glMapBufferRange
glMultiDrawArrays
glMultiDrawArraysIndirect
glMultiDrawElements
glMultiDrawElementsBaseVertex
glMultiDrawElementsIndirect
glPatchParameter
glPrimitiveRestartIndex
glProvokingVertex
(已完成)glUnmapBuffer:表示 Map 操作已經完成,收回指標
(已完成)glVertexArrayElementBuffer
(已完成)glVertexAttrib:指定 vao 的特定 attribute 是如何解析 vbo 的
(已完成)glVertexAttribBinding
glVertexAttribDivisor
(已完成)glVertexAttribFormat
glVertexAttribPointer
glVertexBindingDivisor
State Management
(已完成)glBlendColor
(已完成)glBlendEquation
(已完成)glBlendEquationSeparate
(已完成)glBlendFunc
(已完成)glBlendFuncSeparate
(已完成)glClampColor
(已完成)glClipControl
(已完成)glColorMask
(已完成)glCullFace
(已完成)glDepthFunc:用來控制甚麼條件下可以通過 Depth Test,通過後會更新 Depth Buffer
(已完成)glDepthMask:只能輸入 GL_TRUE Or GL_FALSE,代表說 Depth Buffer 是否可寫入
(已完成)glDepthRange:預設會把 NDC 的值從 [-1, 1] 線性映射到 [0, 1],但用這函數你可以決定值,線性映射到自訂的 [near, far],但 near, far 必須介於 0~1 之間,否則會 clamp,因此預設值 [0, 1] 就已經是最大化利用值域了
glDepthRangeArray
glDepthRangeIndexed
(已完成)glDisable
(已完成)glEnable
(已完成)glFrontFace
(已完成)glGet
(已完成)glGetError
glHint
(已完成)glIsEnabled
(已完成)glLineWidth
(已完成)glLogicOp:開啟 GL_COLOR_LOGIC_OP 後,
glPixelStore
glPointParameter
(已完成)glPointSize
(已完成)glPolygonMode
glPolygonOffset
glSampleCoverage
glScissor
glScissorArray
glScissorIndexed
(已完成)glStencilFunc:設定 Stencil Value 比較的方式來決定是否通過 Stencil Test,還要設定要比較的值,以及比較前要進行怎麼樣的 Mask 運算
glStencilFuncSeparate:與 glStencilFunc 一樣,但可以將面的朝向,即 GL_FRONT、GL_BACK 分開操作設定不同的 Func
(已完成)glStencilMask:將要寫入的 Stancil Value 與 Mask Value 進行 And,可用來決定是否可以寫入 Stencil,且 glClear 也會受 Mask 影響
glStencilMaskSeparate:與 glStencilMask 一樣,但可以將面的朝向,即 GL_FRONT、GL_BACK 分開操作設定不同的 Mask
(已完成)glStencilOp:決定 Stencil Test Depth Test 都通過、Stencil Test 通過但 Depth Test 沒通過、Stencil Test 沒通過的情況下要怎麼更新 Stencil Buffer 的值
(已完成)glStencilOpSeparate:與 glStencilOp 一樣,但可以將面的朝向,即 GL_FRONT、GL_BACK 分開操作設定不同的 Op
(已完成)glViewport
glViewportArray
glViewportIndexed
Transform Feedback
glBeginTransformFeedback
glBindTransformFeedback
glCreateTransformFeedbacks
glDeleteTransformFeedbacks
glDrawTransformFeedback
glDrawTransformFeedbackInstanced
glDrawTransformFeedbackStream
glDrawTransformFeedbackStreamInstanced
glEndTransformFeedback
glGenTransformFeedbacks
glGetTransformFeedback
glGetTransformFeedbackVarying
glIsTransformFeedback
glPauseTransformFeedback
glResumeTransformFeedback
glTransformFeedbackBufferBase
glTransformFeedbackBufferRange
glTransformFeedbackVaryings
Utility
glDispatchCompute
glDispatchComputeIndirect
glGetGraphicsResetStatus
glGetInternalformat
glGetMultisample
glGetString
glMemoryBarrier
Queries
glBeginConditionalRender
(已完成)glBeginQuery
glBeginQueryIndexed
glCreateQueries
glDeleteQueries
glEndConditionalRender
(已完成)glEndQuery
glEndQueryIndexed
(已完成)glGenQueries
glGetQueryIndexed
glGetQueryObject
glGetQueryiv
(已完成)glIsQuery
glQueryCounter
Syncing
glClientWaitSync
glDeleteSync
glFenceSync
glGetSync
glIsSync
glTextureBarrier
glWaitSync
(已完成)Vertex Array Objects
(已完成)glBindVertexArray
(已完成)glDeleteVertexArrays
(已完成)glGenVertexArrays
(已完成)glIsVertexArray
(已完成)Samplers:將 Texture 的 Data 與作用在上面的 Sampler Function 分離
(已完成)glBindSampler
(已完成)glBindSamplers
(已完成)glCreateSamplers
(已完成)glDeleteSamplers
(已完成)glGenSamplers
(已完成)glGetSamplerParameter
(已完成)glIsSampler
(已完成)glSamplerParameter
Program Pipelines
glActiveShaderProgram
(已完成)glBindProgramPipeline
(已完成)glCreateProgramPipelines
(已完成)glDeleteProgramPipelines
(已完成)glGenProgramPipelines
glGetProgramPipeline
glGetProgramPipelineInfoLog
(已完成)glIsProgramPipeline
glValidateProgramPipeline
Debug
(已完成)glDebugMessageCallback
(已完成)glDebugMessageControl:過濾 Error Message 的規則,只顯示那些我們想看的
(已完成)glDebugMessageInsert:發出自己定義的 Error 到 Error Message Queue 中
(已完成)glGetDebugMessageLog:從 Message Log 中一次取得 Error 的資訊,註:已經透過 Call Back 取得的 Error 會從 Message Log 中移除
glGetObjectLabel
glGetObjectPtrLabel
glGetPointerv
glGetProgramInterface
glObjectLabel
glObjectPtrLabel
glPopDebugGroup
glPushDebugGroup