OpenGL ES一些函數詳解(一)

glLoadIdentity和glMultMatrix

?

? ? glLoadIdentity的作用是將當前模型視圖矩陣轉換為單位矩陣(行數和列數相同的矩陣,并且矩陣的左上角至右下角的連線上的元素都為1,其它元素都為0),這樣可以方便矩陣的乘法運算。

??????? glMultMatrix矩陣的乘法.

??????? 如:

glLoadIdentity();glMultiMatrix(A);glMultiMatrix(B);glMultiMatrix(C);

?

針對行向量和當前矩陣,上述代碼可等價于:

(vx vy vz 1) *C*B*A

結果是一個1行4列的矩陣。

?

你可能會奇怪,為什么程序和實際矩陣的運算順序是相反的呢。可以這么想像一下,glMultiMatrix先將矩陣加入到一個棧中保存,當所有的glMultiMatrix操作都完成后,再依次從棧中將緩存的矩陣取出并做相應的乘法操作。由于棧結構是先進后出的數據結構,所以可以猜想glMultiMatrix在執行時并沒有直接將矩陣進行計算,而是先將矩陣放在了棧緩存中。

OpenGL ES 模型視圖之縮放操作?

?

對當前模型視圖進行縮放,在OpenGL ES 1.0中可以使用glScale*函數,而在2.0中需要自己設置縮放矩陣。

?????? 如,分別使用sx,sy,sz表示在x,y,z軸上的縮放比例,那么在1.0中可以這樣縮放模型視圖:

glScalef(sx, sy, sz);

?????? 在2.0中你需要這么做:

float scale[16] = {sx, 0, 0, 0,0,  sy, 0, 0,0,  0, sz, 0,0,  0, 0, 1  };glMultiMatrixf(scale);

?????? 縮放矩陣的推導過程如下:

vS = (vx vy vz 1)?= (vx*sx vy*sy vz*sz 1*1) = v '

?

OpenGL ES 模型視圖之平移操作

? ?對當前模型視圖進行平移操作,在OpenGL ES 1.0中可以使用glTranslate*函數,而在2.0中需要自己設置平移矩陣。

?????? 如,分別使用tx,ty,tz表示在x,y,z軸上的移動距離,那么在1.0中可以這樣平移模型視圖:

glTranslatef(tx, ty, tz);

?????? 在2.0中你需要這么做:

float translation[16] = {1, 0, 0, 0,0,  1, 0, 0,0,  0, 1, 0,tx,  ty, tz, 1  };glMultiMatrixf(translation);

?????? 平移矩陣的推導過程如下:

vT = (vx vy vz 1)?= (vx+tx? vy+ty? vz+tz 1*1) = v '

??OpenGL ES之glRotate函數?????????????????????????

glRotate—— 使用一個旋轉矩陣乘以當前矩陣

函數原型:

void glRotatef(GLfloat angle,? GLfloat x,? GLfloat y,? GLfloat z);?

void glRotatex(GLfixed angle,? GLfixed x,? GLfixed y,? GLfixed z);

函數參數:

angle? 指定旋轉角度,單位為度。

x, y, z ?? 指定一個向量的? x, y, z 坐標

描述:

glRotate產生一個圍繞vector(x,y,x),角度為angle的旋轉操作。旋轉矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:

其中,c = cos(angle),s = sin(angle),并且||(x, y, z)|| = 1(如果不是,OpenGL ES會標準化它)。

如果矩陣模式設為GL_MODELVIEW 或 GL_PROJECTION,那么在glRotate后面繪制的所有對象都將被旋轉。使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。

注意:

旋轉遵循右手規則,如果向量(x,y,z)點正對著用戶的話,旋轉是逆時針的。

???

OpenGL ES之glPushMatrix, glPopMatrix函數

glPushMatrix, glPopMatrix—— 壓入和彈出矩陣棧

void glPushMatrix(void);?

void glPopMatrix(void);

描述:

對于每一種矩陣模式都有一個矩陣棧。對于GL_MODELVIEW,棧的深度最少為16。對于GL_PROJECTION和GL_TEXTURE,棧的深度最少為2。任何模式的當前矩陣都是指該模式的矩陣棧頂的那個矩陣。

glPushMatrix 復制當前矩陣并將其加入棧中,此時它處于棧頂位置。

glPopMatrix?? 彈出當前矩陣棧,當前矩陣被彈出,之前處在其下的那個矩陣將變為棧頂。

默認的,每個棧都包含一個矩陣,唯一標識的矩陣。

向已經填滿的棧壓入矩陣或從僅有一個矩陣的棧中彈出矩陣都會引起錯誤。

注意

每一個紋理單元都有自己的紋理矩陣棧,使用glActiveTexture選擇想要的那個紋理矩陣棧

?????OpenGL ES之glFrustum函數

?

glFrustum—— 使用一個透視矩陣乘以當前矩陣

函數原型:

void glFrustumf(GLfloat left,? GLfloat right,? GLfloat bottom,? GLfloat top,? GLfloat near,? GLfloat far);

void glFrustumx(GLfixed left,? GLfixed right,? GLfixed bottom,? GLfixed top,? GLfixed near,? GLfixed far);

?

函數參數:

left,right???????? 指定左邊和右邊垂直切面的坐標

bottom,top??? 指定下邊和上邊水平切面的坐標

near,far???????? 指定近端和遠端深度切面的距離

描述:

glFrustum描述了一個產生透視投影的透視矩陣。這個矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:

通常,矩陣模式是GL_PROJECTION, 假設眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,? -near)指明了近切面的點,并且被映射到窗口的左下角和右上角。-far指明了遠切面的位置。near 和 far都必須是正數

使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。

注意:

深度緩沖區的精度受到指定的near和far值的影響。far和near的比例越大,區分臨近表面的有效深度緩沖區就越少。如果,

那么,將有大概位的深度緩沖區精度被丟失。因為,當near接近0的時候,r就接近于無窮,所以near一定不要設置為0.

錯誤:

GL_INVALID_VALUE???????? 如果near和far不為整數,left等于right,top等于bottom,near等于far,那么將產生GL_INVALID_VALUE錯誤。

?

OpenGL ES之glOrtho函數

glOrtho—— 使用一個正交矩陣乘以當前矩陣?

函數原型:

void glOrthof(GLfloat left,? GLfloat right,? GLfloat bottom,? GLfloat top,? GLfloat near,? GLfloat far);

void glOrthox(GLfixed left,? GLfixed right,? GLfixed bottom,? GLfixed top,? GLfixed near,? GLfixed far);

函數參數:

left,right???????? 指定左邊和右邊垂直切面的坐標

bottom,top??? 指定下邊和上邊水平切面的坐標

near,far???????? 指定近端和遠端深度切面的距離,如果面在觀察者后面,這兩個值都要為負數。

描述:

glOrtho描述了一個產生平行投影的變換。這個矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:

通常,矩陣模式是GL_PROJECTION, 假設眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,? -near)指明了近切面的點,并且被映射到窗口的左下角和右上角。-far指明了遠切面的位置。near 和 far可以是正數或負數。

使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。

錯誤:

GL_INVALID_VALUE???????? 如果left等于right,top等于bottom,near等于far,那么將產生GL_INVALID_VALUE錯誤。

OpenGL ES之glOrtho和glFrustum的區別

?

?glOrtho和glFrustum的參數是一樣的,但是glFrustum的near和far參數都必須是整數并且near不能為0,而glOrtho的near和far參數沒有這個限制。二者的left, right, bottom, top表達的意思是相同的,都是指某一切面的坐標位置。

??????? glOrtho表達的是正交矩陣,效果是2D的,就像你正對著一個立方體的某一個面看,所以它沒有“近大遠小”的效果。

??????? glFrustum表達的是透視矩陣,效果是3D的,它是一個平頭錐體,具有“近大遠小”的效果。

??????? 所以,如果你要繪制2D效果,可以使用glOrtho,要繪制3D效果,使用glFrustum。由于計算3D需要復雜的計算,所以要開啟深度測試。

CGBitmapContextCreate函數參數詳解

函數原型:

當你調用這個函數的時候,Quartz創建一個位圖繪制環境,也就是位圖上下文。當你向上下文中繪制信息時,Quartz把你要繪制的信息作為位圖數據繪制到指定的內存塊。一個新的位圖上下文的像素格式由三個參數決定:每個組件的位數,顏色空間,alpha選項。alpha值決定了繪制像素的透明性。

CGContextRef CGBitmapContextCreate (

?? void *data, ??? 指向要渲染的繪制內存的地址。這個內存塊的大小至少是(bytesPerRow*height)個字節
?? size_t width, ? ??bitmap的寬度,單位為像素
?? size_t height, ? ?? bitmap的高度,單位為像素
?? size_t bitsPerComponent, ???內存中像素的每個組件的位數.例如,對于32位像素格式和RGB 顏色空間,你應該將這個值設為8
?? size_t bytesPerRow, ? ? ? ? ? ??bitmap的每一行在內存所占的比特數
?? CGColorSpaceRef colorspace, ???bitmap上下文使用的顏色空間。
?? CGBitmapInfo bitmapInfo ? ? ? ?指定bitmap是否包含alpha通道,像素中alpha通道的相對位置,像素組件是整形還是浮點型等信息的字符串。

);

OpenGL ES之glTexImage2D函數

glTexImage2D—— 指定一個二維的紋理圖片

紋理映射一個指定的紋理圖像的每一部分到相應的圖元中。調用帶GL_TEXTURE_2D參數的glEnable和glDisable函數來啟用和禁止二維材質貼圖。默認,二維材質貼圖是禁用的。

調用glTexImage2D來定義材質圖片

函數原型:

void glTexImage2D(GLenum target,  ?指定目標紋理,這個值必須是GL_TEXTURE_2DGLint level,  ?執行細節級別。0是最基本的圖像級別,你表示第N級貼圖細化級別。GLint internalformat,  GLsizei width,  GLsizei height,  GLint border,  GLenum format,  GLenum type, const GLvoid * pixels);

函數參數:

target???? 指定目標紋理,這個值必須是GL_TEXTURE_2D。

level?????? 執行細節級別。0是最基本的圖像級別,你表示第N級貼圖細化級別。

internalformat???? 指定紋理中的顏色組件,這個取值和后面的format取值必須相同。可選的值有

??????????????????? GL_ALPHA,
??????????????????? GL_RGB,
??????????????????? GL_RGBA,
??????????????????? GL_LUMINANCE,?
??????????????????? GL_LUMINANCE_ALPHA 等幾種。

width???? 指定紋理圖像的寬度,必須是2的n次方。紋理圖片至少要支持64個材質元素的寬度

height???? 指定紋理圖像的高度,必須是2的m次方。紋理圖片至少要支持64個材質元素的高度

border??? 指定邊框的寬度。必須為0。

format??? 像素數據的顏色格式,必須和internalformatt取值必須相同。可選的值有

??????????????????? GL_ALPHA,
??????????????????? GL_RGB,
??????????????????? GL_RGBA,
??????????????????? GL_LUMINANCE,?
??????????????????? GL_LUMINANCE_ALPHA 等幾種。

type??????? 指定像素數據的數據類型。可以使用的值有????????????????????

??????????????????? GL_UNSIGNED_BYTE,
??????????????????? GL_UNSIGNED_SHORT_5_6_5,
??????????????????? GL_UNSIGNED_SHORT_4_4_4_4,?
??????????????????? GL_UNSIGNED_SHORT_5_5_5_1

pixels????? 指定內存中指向圖像數據的指針

?

?

?

OpenGL ES之glShadeModel函數

glShadeModel—— 選擇flat或smooth著色

函數原型:

void glShadeModel(GLenum mode)

函數參數:

mode?? 指明使用哪種著色技術,可以取值GL_FLAT和GL_SMOOTH。默認取值是GL_SMOOTH(顏色漸變)。

描述:

原文翻譯太復雜,我在這里總結一下:在使用頂點數據繪制幾何圖形時,如果為每個頂點指定了頂點顏色,此時若使用GL_SMOOTH,每個頂點使用對應的頂點顏色來著色,而頂點之間的片元顏色則使用差值的方式來計算獲得,結果就是漸變色;而若使用GL_FLAT,假設幾何圖形由n個三角形構成,則只會使用頂點顏色數組中最后n個顏色進行著色。

?

GL_SMOOTH著色模式

?

GL_FLAT著色模式

轉載于:https://www.cnblogs.com/Anita9002/p/4931239.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

忽略Java中的自簽名證書

我在職業生涯中遇到過幾次問題,就是我們有時希望允許自簽名證書用于開發或測試目的。 Google的快速搜索顯示了多年來無數Java開發人員遇到的麻煩。 根據確切的證書問題,您可能會收到類似以下內容之一的錯誤,盡管我幾乎肯定有其他表現形式&…

C排序算法:(三)插入排序

像打撲克牌一樣&#xff0c;每次摸一張牌&#xff0c;把牌插入正確位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

sqlserver中自定義函數+存儲過程實現批量刪除

由于項目的需要&#xff0c;很多模塊都要實現批量刪除的功能。為了方便模塊的調用&#xff0c;把批量刪除方法寫成自定義函數。直接上代碼。 自定義函數&#xff1a; ALTER FUNCTION [dbo].[func_SplitById] (str varchar(50),split varchar(10))--傳過來的id字符串 --分割的標…

c語言選擇排序_C語言——選擇排序

1 選擇排序&#xff08;5分&#xff09;題目內容&#xff1a;編寫選擇排序&#xff0c;要求排序過程調用函數實現&#xff0c;在主函數輸入n個數據&#xff0c;調用函數后&#xff0c;輸出排好序的元素輸入格式:輸入整型數n&#xff0c;并輸入n個整數&#xff0c;輸入數據用空格…

算法—巧排撲克牌(C語言)

/*小明剛上小學&#xff0c;學會了第一個撲克牌“魔術”&#xff0c;到處給人表演。魔術的內容是這樣的&#xff1a;他手里握著一疊撲克牌&#xff1a;A&#xff0c;2&#xff0c;....J&#xff0c;Q&#xff0c;K 一共13張。他先自己精心設計它們的順序&#xff0c;然后正面朝…

LeetCode Binary Tree Paths(簡單題)

題意&#xff1a;   給出一個二叉樹&#xff0c;輸出根到所有葉子節點的路徑。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判斷是否到達了葉子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

我的測試和代碼分析工具箱

上周&#xff0c;我們在LINEAS成立了一個“測試技能小組”&#xff0c;該小組用于交換有關測試的知識。 各種各樣的問題反復出現的一個問題是&#xff1a;有哪些工具可以測試和分析您的代碼&#xff1f; 因此&#xff0c;這是我對此的個人回答&#xff0c;按照我傾向于將其介紹…

新唐M0 KEIL環境搭建,找不到device不識別,關鍵:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;網上關于新唐的資料相對ST確實少得可憐&#xff0c;搭建環境也是搞了好久&#xff0c;去keil官網下載安裝了新唐的pack 打開官方參考工程還是提示找不到device&#xff0c;option里面也沒有識別出來。 百度了好久&#xff0c;嘗試了各種辦法&…

c語言有趣代碼_【新課預知】——C語言程序設計

編者按&#xff1a;如今疫情這么嚴重&#xff0c;為了保護好自己&#xff0c;為了身邊的人&#xff0c;大家可一定要聽從國家號召——“宅”起來&#xff01;并且&#xff0c;小編們為了讓大家伙“宅”得更加健康&#xff0c;可是費了不少腦筋呢&#xff0c;學哉數理公眾號首次…

用R語言的quantreg包進行分位數回歸

什么是分位數回歸 分位數回歸(Quantile Regression)是計量經濟學的研究前沿方向之一&#xff0c;它利用解釋變量的多個分位數&#xff08;例如四分位、十分位、百分位等&#xff09;來得到被解釋變量的條件分布的相應的分位數方程。 與傳統的OLS只得到均值方程相比&#xff0c;…

算法—快速排序Sqrt (C語言)

/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const void* b) {return (*(int *)a-*(int *)b); }int main() {int i,a[]{32,29,59,8,22,68,89,77},n;nsizeof(a)/sizeof(a[0]);printf("排序前:\n");for(i0;i&…

常規單元測試和存根–測??試技術4

我的上一個博客是有關測試代碼的方法以及討論您要做和不需要進行測試的方法的一系列博客中的第三篇。 它基于我使用一種非常常見的模式從數據庫中檢索地址的簡單方案&#xff1a; …并且我提出了這樣的想法&#xff1a;任何不包含任何邏輯的類都不需要進行單元測試。 在其中&am…

中微CMS32 Keil環境搭建

打開中微官網https://www.mcu.com.cn/Products/113/pids/.html 把這三個資料都下載好。 環境搭建需要用的就是第三個pack包了 坑爹的是pack包下載下來是.zip格式 下載好后需要修改為.pack格式 運行即可。 打開三個資料中的demo code的工程 target和device都能識別出 編…

Windows下sass無法編譯

最近windows下使用sass老是出現各種莫名其買的問題&#xff0c;下面是我的一些解決辦法 windows下編譯sass不支持中文解決辦法網上給的是 解決辦法&#xff1a; 1.koala可視化編譯工具&#xff0c; 找到安裝目錄里面sass-3.3.7模塊下面的engine.rb文件&#xff0c;例如下面路徑…

數據庫面試中常用的10個問題

1&#xff0e;觸發器的作用&#xff1f;答&#xff1a;觸發器是一中特殊的存儲過程&#xff0c;主要是通過事件來觸發而被執行的。它可以強化約束&#xff0c;來維護數據的完整性和一致性&#xff0c;可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如&…

測試技巧–不編寫測試

對此沒有太多疑問&#xff0c;測試代碼的方式是一個有爭議的問題。 不同的測試技術因各種原因&#xff08;包括企業文化&#xff0c;經驗和總體心理觀點&#xff09;而受到不同開發人員的青睞。 例如&#xff0c;您可能更喜歡編寫經典的單元測試&#xff0c;通過檢查返回值來單…

Ubuntu鏡像下載地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下載速度挺快的

算法—實現排列 A(n,m)

/* 實現排列A&#xff08;n,m&#xff09;*/ #include "stdio.h" int m,n,a[30]; long s0; int main() {int p(int k);printf("input n(n<10):"); scanf("%d",&n);printf("input m(<1m<n):"); scanf("%d",&…

oracle忘記用戶密碼

在cmd命令行下輸入sqlplus / as sysdba alter user system identified by abc; 就可以將system用戶的密碼改成abc了。 alter user sys identified by abc; sys用戶的密碼也改成abc了。 然后你再登錄sqlplus: 轉載于:https://www.cnblogs.com/zzlp/p/4936109.html

python初體驗-hello world答案_Python初體驗_基礎(一)

一&#xff1a;變量 變量的賦值&#xff1a; name “Meng” 上述代碼聲明了一個變量&#xff0c;變量名為name&#xff0c;變量name的值為&#xff1a;”Meng“ 變量定義&#xff1a; 一個在內存存數據的容器。 變量的意義&#xff1a; 保存程序執行的中間結果或狀態&#xff…