KTL 一個支援C++14編輯公式的K線技術工具平臺 - 第六版,支援OpenGL,3D上帝視角俯視K線概貌。

bbqz007發表於2022-04-28

K,K線,Candle蠟燭圖。

T,技術分析,工具平臺

L,公式Language語言使用c++14,Lite小巧簡易。

專案倉庫:https://github.com/bbqz007/KTL

國內倉庫:https://gitee.com/bbqz007/KTL 

CoreAnimation for Windows: https://github.com/bbqz007/xw

zqt5 一個超簡單的Qt5視窗語法: https://github.com/bbqz007/zhelper-qt5Widgets

zqlite3 一個超簡單的流式語法,整合封裝Sqlite3 capis 與 SQL 跟 c/c++程式繫結:https://github.com/bbqz007/sqlite3zz

zgl 一個對OpenGL常規功能api重新抽象封裝。

KTL提供一個c++14編譯平臺,使用者可以使用c++14編輯自定義技術指標等。

使用者可以使用crt常用函式,c++標準庫容器以及演算法,c++14特性程式設計。

 

本期更新內容

加入了OpenGL程式設計支援。

使用者可以在自定製的QT視窗使用OpenGL繪製3D圖形。

 

 上帝說我看到的K線不是平面的。

 

 

 下圖是以一年中第幾個交易日時間座標橫切面,由年初第1個交易日到年末最後一個交易日的,各年交易日的同比變化趨勢。

 

 

本期繼續簡單易用,對OpenGL 2.1的基本程式設計相關的api進行了全新的抽象封裝。對於沒時間去把握那套不太友好api的朋友,但只需要使用最常規的功能,可以獲得更好的體驗。

 

首先說明為什麼選擇OpenGL 2.1

1. 因為本平臺不是面向程式設計精英怪,也不需要高階技術高階技巧。儘管你可以使用GL3以上的所有的api,只要你的硬體支援。

2. 至GL 2.1,以fixed-pipeline程式設計為主, 也就是內建著色器,你不需要GLSL來實現所有的stages,比如矩陣,光照。GL 3.0以後,轉向programmable-pipeline程式設計為主,也就是為各Shader著色器程式設計,你必須要是隻精英怪,深知各版本GLSL的差別,數學有點要求。

3. 承接上一點,GL 2.1程式設計,關心的是輸入跟狀態設定。演算法交給fixed-pipeline。

4. 所以fixed-pipeline是一個黑盒,有輸入,輸出,還有控制。

5. 多媒體程式設計,常用的模式是filter-pipeline,最簡單有三個元件,Source,Filter,Render。GL2.1內建fixed-pipeline就是這個Filter,Render就是視窗畫布。Source自然就是輸入資料流。

6. 按上面的模式,三個元件從屬三個不同的裝置,cpu裝置(host),gpu裝置,視窗顯示裝置。

7. 資料流從cpu裝置,輸入到gpu裝置,gpu裝置處理產出結果, 輸出到視窗顯示裝置。

8. GL 2.1沒有FBO,只能輸出到視窗顯示裝置。

9. 兩種記憶體資源,cpu裝置上的記憶體,gpu裝置上的記憶體。本封裝將所有GPU裝置的緩衝或紋理視作gpu裝置上的記憶體。

 

所以封裝抽象成

1. GLFixedPipelineClient,設定資料輸入流,如開啟或關閉Vertex,Color等,資料繫結到cpu記憶體還是gpu記憶體。這裡借用directShow,IPin介面概念,輸入流各種資料通過connect或disconnect到GL內建Pipeline。還有常用的狀態控制開關,如光照開關,紋理開關,深度檢測開關。

2. GPU記憶體,GpuVertexArrayGpuImage2D紋理。alloc方法分配或定義記憶體的大小。copyFromCpuMemory方法將cpu的記憶體寫到gpu的記憶體。copyToCpuMemory方法把資料從gpu的記憶體寫到cpu的記憶體。

3. 光源Light0,Light1,... , Light7。簡化專業術語。backLight,背光或環境光。highLight,高光反射。sunLight,自然光。spotAt,位置。spotDirect,方向。spotAngle,散射角度。spotFocus,焦點大小。spotEnergy,光線強弱。

4. 材質Material。簡化專業術語。backLightReflectPct,背光反射混合光。highLightReflectPct,高光反射混合光。sunLightReflectPct,自然光反射混合光。

5. 輸入流資料內容指定使用,這裡不使用繫結一詞,因為glBind*相關的函式與這個無關,太容易混亂。GLCpuClient使用cpu記憶體指定到輸入流資料的方法如vertexUseCpuBuffer。GpuVertexArray使用gpu記憶體指定到輸入流資料的方法如vertextUseThisGpuBuffer

 

示例1,直接使用cpu記憶體。

 1     float v[][3] = {...};  // Vertex
 2     float c[][3] = {...};  // Color
 3     float tc[][3] = {...}; // TexCoord
 4     float ix[][4] = {...}; // Element
 5 
 6     zhelper::GL2::GLCpuClient cpu;
 7             cpu.ensure();
 8             cpu.colorUseCpuBuffer(3, GL_FLOAT, c);
 9             cpu.vertexUseCpuBuffer(3, GL_FLOAT, v);
10 
11             cpu.connectColor().connectVertex();
12             cpu.drawElements(GL_QUADS, sizeof(ix)/sizeof(GLint), ix[0]);
13             cpu.disconnectColor().disconnectVertex();  

 

示例2,使用Gpu記憶體。

 1     float v[][3] = {...};  // Vertex
 2     float c[][3] = {...};  // Color
 3     float tc[][3] = {...}; // TexCoord
 4     float ix[][4] = {...}; // Element
 5  
 6     zhelper::GL2::GpuVertexArray gpubuf;
 7             gpubuf.ensure();
 8             gpubuf.alloc(sizeof(v) + sizeof(c) + sizeof(tc), GL_STREAM_DRAW);
 9             gpubuf.copy(0, sizeof(v), v);
10             gpubuf.copy(sizeof(v), sizeof(c), c);
11             gpubuf.copy(sizeof(v) + sizeof(c), sizeof(tc), tc);
12             gpubuf.vertex3fUseThisGpuBuffer(0, (GLvoid*)0);
13             gpubuf.color3fUseThisGpuBuffer(0, (GLvoid*)sizeof(v));
14             gpubuf.texCoordUseThisGpuBuffer(0, 2, GL_FLOAT, (GLvoid*)(sizeof(v) + sizeof(c)));
15 
16     zhelper::GL2::GLFixedPipelineClient cpu;
17        cpu.ensure();
18 cpu.connectColor().connectVertex().connectTexCoord(); 19 cpu.drawElements(GL_QUADS, sizeof(ix)/sizeof(GLint), ix[begin]); 20 cpu.disconnectColor().disconnectVertex().disconnectTexCoord();

 

示例3,光源詞彙通俗化

 1 // 專業詞彙
 2     glLightfv(GL_LIGHT0, GL_AMBIENT, lc[0]);           // Back Light
 3     glLightfv(GL_LIGHT0, GL_SPECULAR, lc[0]);          // High Light
 4     glLightfv(GL_LIGHT0, GL_DIFFUSE, lc[0]);        // Sun  Light; w: 0, from far away; 1, at a position
 5     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, lc[0]);
 6     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, lc[0]);
 7     glLightfv(GL_LIGHT0, GL_POSITION, lc[1]);
 8     glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 32.0);
 9     glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.5);
10     glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 1.5);
11 
12 // 通俗詞彙
13     zhelper::GL2::Light0 light0;
14     light0.backLightColor(lc[0]);
15     light0.highLightColor(lc[0]);
16     light0.sunLightColor(lc[0]);
17     light0.spotAt(lc[1]);
18     light0.spotDirect(dir[0]);
19     light0.spotEnergy(32., 1.5, .15);
20 
21     zhelper::GL2::Material material;
22     material.both.backLightReflectPct(lc[0]);
23     material.both.sunLightReflectPct(lc[0]);

 

相關文章