美德薩斯州 ICON公司利用大型 3D 打印機和水泥漿為源料興建房屋.從圖片梯到3D打印的只是牆體部分.水平平臺並非打印,而木制屋頂更是預製件.水泥噴嘴孔徑從圖片可以梯出應不小50mm.牆體的光潔度你就不要追求啦,牆身在3米以下應該可以保持垂直.牆體如果在加高肯定會有問題(Y軸平行).所以我講是平房.牆身並非實心(填充密度).這個問題不大只要牆身夠厚,剛性有一定保證.但牆體內無鋼筋唔知是否能抵禦颱風和地震.半日內建成能完成牆體打印.只要台大型 3D 打印機能快速部署.技術純熟加上廉價肯定會有市場.
FPS
FPS全稱為Frames Per Second.用於統計遊戲與影片每秒的渲染畫面(幀)次數.此值越高畫面越流暢,電影以每秒24格菲林進行播放.所以你的遊戲要流暢無停頓感.需要不低於24幀最好高於30幀.當然幀數越高越好.
FPS算法如下:
FPS = 100 * Frequency / (currentTime – startTime);
Frequency為時鐘頻率. currentTime與 startTime為前後兩次時鐘
Windows下你需要高精度計數器:
返回硬件級高精度時鐘頻率,若返回0代表系統不支持.
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
返回硬件級高精度計數器,若返回0代表系統不支持.
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
LARGE_INTEGER:為64BIT結構
此兩個函式需要winbase.h頭文檔和Kernel32.LIB庫
#include <winbase.h>
#pragma comment(lib, “Kernel32.LIB”)
定義如下FPS結構:
typedef struct FPS_TYP {
LARGE_INTEGER Frequency;// 計數器的頻率
LARGE_INTEGER startTime;// 啟動時鐘
float Frames;// 每秒渲染幀數
int n;// 臨時幀計數器
}FPS,*FPS_PTR;
初此化高精度定時器
bool Init_FPS(FPS_PTR fps)
{
// 返回硬件支持的高精度計數器的頻率
if (QueryPerformanceFrequency(&fps->Frequency) == false)
return false;
// 獲取啟動時鐘
QueryPerformanceCounter(&fps->startTime);//
return true;
}
計算每秒渲染幀數,每100幀進行一次計算
float Get_FPS(FPS_PTR fps)
{
++fps->n;
if (fps->n > 100)
{
LARGE_INTEGER currentTime;
// 返回高精度計數器
QueryPerformanceCounter(¤tTime);
fps->Frames = (float)100 * (float)fps->Frequency.QuadPart / ((float)currentTime.QuadPart – (float)fps->startTime.QuadPart);
fps->startTime = currentTime;// 重置時間
fps->n = 0;
}
return fps->Frames;
}
计算两次测量所花费时间
float Get_Counter_FPS(FPS_PTR fps){
LARGE_INTEGER currentTime;//当前时钟
// 返回高精度计数器
QueryPerformanceCounter(¤tTime);
float seconds = ((float)currentTime.QuadPart – (float)fps->startTime.QuadPart) / (float)fps->Frequency.QuadPart;
fps->startTime = currentTime;
return seconds;
}
OpenGL頂點數組
遊戲的實際的開發中將會大量頻繁地處理頂點,在簡單多邊形可以使用代碼直接生成模型頂點.而真正的遊戲隨便一個模型就可能有幾百或幾千個多邊形.不可能使用代碼直接生成.解決的方法是使用『頂點數組』(Vertex Array).通過建模軟件進形3D建模,然後輸出特定的文本文檔或二進制文檔.可分為以下幾個部驟.
- 從磁盤上的模型文檔中載入模型的頂點數據.
- 將頂點數據儲存在數組(array),如將頂點座標存入獨立數組,法線數組,顏色數組.
- 當OpenGL需要頂點數據時,載入相應的數據.
啟用『頂點數組』
void glEnableClientState(GLenum array);
禁用『頂點數組』
void glDisableClientState(GLenum array);
參數 | 簡介 |
GL_COLOR_ARRAY | 啟用頂點顏色數組 |
GL_EDGE_FLAG_ARRAY | 啟用頂點的邊EdgeFlag數組 |
GL_INDEX_ARRAY | 啟用頂點的調色板索引數組 |
GL_NORMAL_ARRAY | 啟用法線數組 |
GL_TEXTURE_COORD_ARRAY | 啟用紋理座標數組 |
GL_VERTEX_ARRAY | 啟用定點座標數組 |
載入頂點的顏色數組:
void glVertexPointer(GLint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點顏色分量其值只能為3(rgb)或4(rgba) |
type | 數組的數據類型
GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個顏色之間的字節數,如果顏色數據是緊湊則填為0 |
pointer | 頂點的顏色數組 |
載入邊(Edge)數組:
void glEdgeFlagPointer(GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
stride | 跨度 |
pointer | 多邊形邊(Edge)數組bool類型數值 |
載入調色板顏色索引數組
void glIndexPointer(GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度相鄰索引之間的字節數 |
pointer | 調色板顏色索引數組 |
載入頂點的法線向量,每三個元素組成一個法線向量
void glNormalPointer(GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
type | 數組的數據類型
GL_BYTE GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度相鄰法線之間的字節數 |
pointer | 頂點的法線向量數組 |
載入頂點的紋理座標數組void glTexCoordPointer(Glint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點的座標數,其值只能為1,2,3,4
1為1維紋理(s) 2為2維紋理(s,t) 3與4較小使用 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個紋理之間的字節數 |
pointer | 頂點紋理座標數組 |
載入頂點座標數組:
void glVertexPointer(Glint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點的座標分量:2,3,4 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個頂點座標之間的字節數,如果是緊湊方置其值為0 |
pointer | 頂點座標數組 |
繪畫所有當前以啟用的頂點數組void glDrawArrays(GLenum mode,GLint first,GLsizei count);
參數 | 簡介 |
mode | GL_POINTS:點
GL_LINE_STRIP:相連的直線 GL_LINE_LOOP:閉合的相連直線 GL_LINES:非相連的直線 GL_TRIANGLE_STRIP:相連的三角形 GL_TRIANGLE_FAN:共用頂點三角形 GL_TRIANGLES:度立的三角形 GL_QUAD_STRIP:相連的四邊形 GL_QUADS:四邊形 GL_POLYGON:任意頂點多邊形 |
first | 數組起此索引 |
count | 繪畫的頂點量 |
以任意順序繪畫以啟用的頂點數組void glDrawElements(GLenum mode,GLsizei count,GLenum type,const GLvoid *indices);
參數 | 簡介 |
mode | 與glDrawArrays()的一致 |
count | 索引數組的長度 |
type | 索引的數據類型,只能是無符號整數GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT GL_UNSIGNED_INT |
indices: | 索引數組 |
按值定的範圍繪畫以啟用的頂點數組
void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
參數 | 簡介 |
mode | 與glDrawArrays()的一致 |
start | 索引數組開此索引 |
end | 索引數組結束索引 |
count | 索引數組的長度 |
type | 索引的數據類型,只能是無符號整數與glDrawElements()的一致 |
indices: | 索引數組 |
按數組索引繪畫單一個頂點void glArrayElement(GLint index);
參數 | 簡介 |
index | 頂點的索引 |
演示程式中繪畫幾百個球體不斷移動,若不使用頂點數組每秒只有約66幀,而若使用頂點數組性能大幅度提升到每秒有200幀.性能有驚人的提升(不同的計算機性能有所差別).按空格鍵啟用或禁用頂點數組.演示程式下載:
OpenGL顯示列表
OpenGL支持稱為『顯示列表』(Display List)性能優化,它相當於把OpenGL代碼進行預編譯,並載入顯卡記憶體,從而降低系統開銷,但它對於程式的性能改善並不總是特別明顯,而且不同的圖形卡廠商的實現也有方式各異,最終效果視情況而定,不過最差的情況下也要比不使用好.
生成顯示列表, 返回列表索引
GLuint glGenLists(GLsizei range);
range:顯示列表數量
判斷顯示列表是否有效,有效則返回GL_TRUE
GLboolean glIsList (GLuint list);
list:列表索引
向顯示列表填充命令,把代碼寫在glNewList()與glEndList()
void glNewList(GLuint list,GLenum mode);
list:列表索引
mode:編譯模式分別有GL_COMPILE(編譯)和GL_COMPILE_AND_EXECUTE(編譯並執行)
結束填充數據
void glEndList(void);
當你擁有顯示列表,可以在任何地方調用顯示列表
void glCallList(GLuint list);
如果要一次調用多個顯示列表,依次調用.
void glCallLists(GLsizei num,GLenum type,const GLvoid *lists);
num:顯示列表個數
type:索引的類型
lists:顯示列表索引數組
如果想其它索引值開次執行,從offset開此到num-1結束
void glListName(GLuint offset);
offset:索引數組的偏移
顯示列表的燒毀,當創建顯示列表需要為其分配記憶體存儲OpenGL代碼,當程式結束時要將記憶體釋放,防止記憶體洩漏
void glDeleteLists(GLuint list,GLsizei range);
list:列表索引
range:顯示列表數量
執行顯示列表演示代碼:
if(glIsList(list->ID) == GL_TRUE)
{
glCallList(list->ID);// 調用顯示列表
}
else
{
list->ID = glGenLists(1);// 生成顯示列表
glNewList(list->ID, GL_COMPILE_AND_EXECUTE);
// 填入執行代碼
glEndList();
}
演示程式中繪畫幾百個球體不斷移動,若不使用顯示列表每秒大約200幀,而若使用顯示列表性能大幅度提升,每秒去到670幀.真是出乎意料.按空格鍵啟用或禁用顯示列表.下載演示程式:
互聯網之 Cloudflare推出免費DNS(1.1.1.1)
互聯網公司Cloudflare推出免費的DNS服務,與APNIC進行合作使用它的IP位址(1.1.1.1), Cloudflare保證你使用它的DNS服務會絕對保證你的隱私,絕不會出售您的數據,或用來定位廣告,更不會記錄您的 IP 位址.
而且Cloudflare聲稱它的DNS服務比其它公司的DNS服務速度更快,比起GOOGLE的快最小兩倍.
DNS | 響應速度 |
1.1.1.1 | 14.8ms |
Cisco OpenDNS | 20.6ms |
Google Public DNS | 34.7ms |
Average ISP | 68.23ms |
在Windows10設定DNS伺服器IP位址
- Win+E打開『檔案總管』
- 點選打開『控制台\網路和網際網路\網路和共用中心』
- 點選『乙太網絡』
- 點選『內容』
- 雙擊打開『網際網路通信協定第4版(TCP/IPV4)』 勾選『使用下列的DNS伺服器位址』
- IPV4『慣用DNS伺服器』填1.1.1
- IPV4『其它DNS伺服器』填0.0.1
- 雙擊打開『網際網路通信協定第6版(TCP/IPV6)』勾選『使用下列的DNS伺服器位址』
- IPV6『慣用DNS伺服器』填 2606:4700:4700::1111
- IPV6『其它DNS伺服器』填 2606:4700:4700::1001
- 重啟瀏覽器
OpenGL之圖像合成器
對圖像(紋理)合成你可以得到圖像變換的動畫效果,如『燈火』.通過讀取兩張圖像,然後對其進行插值運算,最後生成平滑過渡的效果.演示程式下載:
對兩個或者多個紋理進行組合:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE);
紋理平滑過渡
GLfloat texEnvColor[] = {0.0f,0.0f,0.0f,combiner->interpol };
glActiveTexture(GL_TEXTURE1);
glTexEnvfv(GL_TEXTURE_ENV,GL_TEXTURE_ENV_COLOR, texEnvColor);
載入紋理單元0
Load_File_Texture(&combiner->texture0, hInstance, filename0);
激活紋理單元0
glActiveTexture(GL_TEXTURE0);
綁定紋理0
Bind_Image_Texture(&combiner->texture0);
glEnable(GL_TEXTURE_2D);
將紋理傳遞到下一個單元
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
載入紋理1
Load_File_Texture(&combiner->texture1, hInstance, filename1);
激活紋理單元1
glActiveTexture(GL_TEXTURE1);
綁定紋理1
Bind_Image_Texture(&combiner->texture1);
glEnable(GL_TEXTURE_2D);
設置紋理組合模式
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE);
使用插值組合函式
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
設置成紋理單元0的輸出
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
設置成當前紋理圖像
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
為紋理單元設置ARG2
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
使用alpha常數修改RGB分量
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
Windows10之功能更新版本1709錯誤碼0xc1900205
近日Windows10更新版本1709時總會彈出錯誤碼0xc1900205,使用『Windows Update』與『Windows10更新小幫手』均出錯並彈出下面的信息:
Microsoft 無法在您的電腦上安裝重要的安全性更新。
請連絡 Microsoft 支援服務以獲得解決此錯誤的協助。 請將此錯誤碼提供給支援人員: 0xc1900205 |
通過如下方法即可修復:
- 新增『文字文件.txt』輸入下面命令,並保存為『cmd』.(此方法適合大量類似問題)
- 以系統管理員身份執行CMD
net stop wuauserv
Dism.exe /online /Cleanup-Image /StartComponentCleanup Dism.exe /online /Cleanup-Image /RestoreHealth net start wuauserv |
3.我已生成cmd文檔可以直接下載:
Windows10之以系統管理員身份執行命令視窗CMD
在Windows10下很多命令需要『系統管理員』Administrator的『權限』才能執行,有4中方法打開
- 快捷鍵『WIN+X+A』打開命令視窗(系統管理員:命令提示字元),此方法成功較低不建議使用
- 快捷鍵『WIN+E』打開『檔案總管』,按住『shift』鍵以鼠標右鍵點擊任意『檔案資料夾』彈出菜單『在此處開啟命令視窗』此方法無系統管理員權限
- 快捷鍵『WIN+E』打開『檔案總管』定位『C:\Windows\System32\cmd.exe』以鼠標右鍵點擊彈出菜單『以系統管理員身份執行』打開命令視窗
- 新增『文字文件』寫入你要執行的命令並保存,將『副檔名』改為『cmd』.以鼠標右鍵點擊彈出菜單『以系統管理員身份執行』打開命令視窗,此方法最為方便
Android桌面已鎖定
近日台Android電話在刪除或移動APP時,彈出『桌面已鎖定』大驚難道中毒?細想之下應該是桌面被鎖定,通過下面設定即可修復
- 打開『設定』
- 打開『系統和設備/桌面與近期任務』
- 禁用『桌面佈局/鎖定桌面佈局』
OpenGL之環境映射
環境映射即在表面『映射』其它物體,如湖面上『映射』出『樹、雲、天、人』,而OpenGL並不是真正地對環境進行反射獲得的效果.演示函式下載:
- 創建物體表面的紋理圖
- 使用OpenGL自動生成相應的紋理座標,可以使用GL_SPHERE_MAP(球體映射)和GL_REFLECTION_MAP(反射光映射)
- 移動鏡頭到物體並指向視點
- 隨著物體的移動而生成新的紋理座標,使得環境反射效果隨著物體移動而變化,使用glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成紋理
- 如果要填充多邊形顏色,你要禁用紋理glDisable(GL_TEXTURE_2D);才能正確渲染.
紋理座標生成函式:
void glTexGenf(GLenum coord,GLenum pname, GLenum param)
glTexGenf()函式coord: | 簡介 |
GL_S | s紋理坐標 |
GL_T | t紋理坐標 |
GL_R | r紋理坐標 |
GL_Q | q紋理坐標 |
glTexGenf()函式pname: | param簡介 |
GL_TEXTURE_GEN_MODE | GL_SPHERE_MAP
GL_REFLECTION_MAP GL_OBJECT_LINEAR GL_EYE_LINEAR GL_NORMAL_MAP |
GL_OBJECT_PLANE | Param指向生成紋理坐標所需的4個元素,配合GL_OBJECT_LINEAR使用 |
GL_EYE_PLANE | Param指向生成紋理坐標所需的4個元素,配合GL_EYE_LINEAR使用 |
生成環境映射紋理代碼
glGenTextures(1, &texture.ID);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);
設定紋理參數代碼
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
將紋理坐標生成模式設置為環境映射(反射光)函式
glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
移動鏡頭到物體並指向視點,設置屏幕以匹配環境映射的大小
glViewport(0, 0, 256,256);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
設置90度視口
gluPerspective(90, 1, 0.1, 500);
glMatrixMode(GL_MODELVIEW);
glClear(GL_DEPTH_BUFFER_BIT);
載入單位矩陣
glLoadIdentity();
設定相機
gluLookAt(0.0, 0.0, 0.0,posx,posy,posz,neggx,negy,negz);
通過glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成環鏡映射紋理
從緩衝區中拷貝像素創建紋理函式
typedef void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
從緩衝區中拷貝部分像素創建紋理函式
typedef void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
渲染環鏡映射代碼
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
使用立方體映射
glEnable(GL_TEXTURE_CUBE_MAP);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
gluSphere(quadric, 1.0, 64, 64);// 繪畫大球球體
glDisable(GL_TEXTURE_CUBE_MAP);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
你必須登入才能發表留言。