Tessellation Shader的GLSL入門實現: 平面
此文續http://blog.csdn.net/lsldd/article/details/8794823
這次來看一看如何細分一個平面(quads)
對於quads細分演算法而言,需要傳遞6個細分引數:4個Outer和2個Inner。每個引數控制的細分如下圖所示。
out1:控制四邊形左邊、外側的細分數量。上圖為1.
out2:控制四邊形下邊、外側的細分數量。上圖為2.
out3:控制四邊形右邊、外側的細分數量。上圖為3.
out4:控制四邊形上邊、外側的細分數量。上圖為4.
out1:控制四邊形橫向、內側的細分數量。上圖為5.
out1:控制四邊形縱向、外側的細分數量。上圖為6.
Vertex Shader和Fragment Shader與之前文章一樣,什麼都不用幹。現在看看TE 和TS shader。
Tessellation Control Shader:
#version 400
layout( vertices=4 ) out;
uniform int Outer0;
uniform int Outer1;
uniform int Outer2;
uniform int Outer3;
uniform int Inner0;
uniform int Inner1;
void main()
{
// Pass along the vertex position unmodified
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
gl_TessLevelOuter[0] = float(Outer0);
gl_TessLevelOuter[1] = float(Outer1);
gl_TessLevelOuter[2] = float(Outer2);
gl_TessLevelOuter[3] = float(Outer3);
gl_TessLevelInner[0] = float(Inner0);
gl_TessLevelInner[1] = float(Inner1);
}
這裡就是設定6個細分引數。已經解釋過。注意的是在程式碼中引數標號我從0開始。
Tessellation Evaluation Shader:
#version 400
layout( quads, equal_spacing, ccw ) in;
uniform mat4 ModelViewProjectionMatrix;
void main()
{
float u = gl_TessCoord.x;
float v = gl_TessCoord.y;
vec4 p0 = gl_in[0].gl_Position;
vec4 p1 = gl_in[1].gl_Position;
vec4 p2 = gl_in[2].gl_Position;
vec4 p3 = gl_in[3].gl_Position;
// Linear interpolation
gl_Position =
p0 * (1-u) * (1-v) +
p1 * u * (1-v) +
p3 * v * (1-u) +
p2 * u * v;
// Transform to clip coordinates
gl_Position = ModelViewProjectionMatrix * gl_Position;
}
注意這裡使用了經典的四邊形插值演算法,即已知4個頂點,根據gl_TessCoord中的u,v引數插值計算對應的點座標。示例程式碼和講解也可以從OpengGL Shading Language Cook Book中找到。
相關文章
- 一個簡單的Tessellation Shader
- Shader學習筆記,通過GLSL實現(一)筆記
- 【GLSL教程】(三)在OpenGL中向shader傳遞資訊
- Shader從入門到跑路:實作螢幕扭曲效果
- Unity Shader 入門精要 筆記(1)Unity筆記
- 【Unity Shader入門精要】— 高階篇Unity
- 在 iOS 中使用 GLSL 實現抖音特效iOS特效
- Shader從入門到跑路:樸實無華的圖形學基礎
- 關於Vulkan應用程式執行時編譯GLSL Shader檔案的方法編譯
- Shader從入門到跑路:自定義紋理輸入
- 在WebGL中使用GLSL實現光線追蹤Web
- Unity Shader 實現雨天的水面漣漪效果Unity
- ThreeJS Shader的效果樣例網格平面和網格球體(一)JS
- BRDF理論及shader實現(下)
- Shader從入門到跑路:螢幕後處理效果
- 【GLSL教程】(二)在OpenGL中使用GLSL
- Laravel 廣播入門,彈幕的實現Laravel
- 入門:解除安裝Oracle的實現方法Oracle
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- OpenGL 和 GLSL 在頂點著色器中動態調整裁剪平面引數的簡單程式碼示例
- tessellation 曲面細分 on AndroidAndroid
- 入門 | 32個常用 Python 實現Python
- VT 入門篇——最小 VT 實現(上)
- UE4 Shader 編譯以及變種實現編譯
- Unity Shader- UV動畫原理及簡易實現Unity動畫
- Flutter入門篇(三)— 如何實現登入動畫效果Flutter動畫
- SpringMVC聯手REST實現入門級的CRUDSpringMVCREST
- Nginx入門到實戰(2)場景實現篇Nginx
- Shader從入門到跑路:顏色自定義輸出、紋理取樣
- 《Unity Shader入門精要》自學筆記(五)第八章 透明效果Unity筆記
- jQuery入門(六)jQuery實現瀑布分頁jQuery
- web前端入門到實戰:非同步載入CSS最簡單的實現方式Web前端非同步CSS
- MySQL匯入匯出平面檔案MySql
- Ionic2入門教程 實現TodoList App-2 實現TodoList AppAPP
- 快速入門:使用 .NET Aspire 元件實現快取元件快取
- 通過 Socket 實現 TCP 程式設計入門TCP程式設計
- 通過 Socket 實現 UDP 程式設計 入門UDP程式設計
- Socket程式設計入門(基於Java實現)程式設計Java