當前位置:首頁 » 操作系統 » opengl填充演算法

opengl填充演算法

發布時間: 2022-12-07 07:22:35

① OpenGL入門-4

圖像存儲空間 = 圖像的高度 * 圖像寬度 * 每個像素的位元組數

RGB(8位),寬度:199像素點。圖片每行需要多少存儲空間?
199 * 3 * 8 = 597位元組

tga(紋理文件)。1個位元組1個位元組。
OpenGL紋理文件:.tga文件.

OpenGL ES! 壓縮圖片文件.png/jpeg壓縮
當紋理來使用。

//改變像素存儲方式
void glPixelStorei(GLenum pname, GLint param);
//恢復像素存儲方式
void glPixelStoref(GLenum pname,GLfloat param);
//舉例:
//參數1:GL_UNPACK_ALTGNMENT 指定OpenGL 如何從數據緩存區中解包圖像數據
//參數2:表示參數GL_UNPACK_ALIGNMENT 設置的值

//GL_UNPACK_ALIGNMENT 指內存中每個像素行起點的排列請求,允許設置為1(byte排列)、2(排列為偶數btye的行)、4(字word排列)、8(行從雙位元組邊界開始)
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

參數1:x,矩形左下角的窗口坐標
參數2:y,矩形左下角的窗口坐標
參數3:width,矩形的寬,以像素為單位
參數4:height,矩形的高,以像素為單位
參數5:format,OpenGL的像素格式
參數6:type,解釋參數pixels指向的數據,告訴OpenGL 使用緩存區中的什麼數據類型來存儲顏色分量,像素數據的數據類型。
參數7:pixels,指向圖形數據的指針
void glReadPixls(GLint x, GLint y, GLSizei width, GLSizei height, GLenum format, GLenum type, const void *pixels);

glReadBuffer(mode); ->指定讀取的緩存
glWriteBuffer(mode); -> 指定寫入的緩存

void glTexImage1D(GLenum target,GLint level, GLint internalformat,GLsizei width, GLint border, GLenum format, GLenum type, void *data);

void glTextImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint bordr, GLenum format, GLenum type,void *data);

void glTextImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,GLsizei depth, GLint bordr, GLenum format, GLenum type,void *data);

void glTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLsizei width, GLenum format, GLenum type, const GLvoid *data);

void glTexSubImage2D(GLenum target, GLint level, GLint xOffset,GLint yOffset,GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data);

void glTexSubImage3D(GLenum target, GLint level, GLint xOffset,GLint yOffset,GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *data);

void glCopyTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLint x, GLint y, GLsizei width);

void glCopyTexSubImage2D(GLenum target,GLint level,GLint xOffset, GLint yOffset,GLint x, GLint y,GLsizei width, GLsizei height);

void glCopyTexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLint x, GLint y, GLsizei width, GLsizei height);

void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformt, GLint x, GLint y, GLsizei width, GLint border);

void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformt, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);

x,y在顏色緩存區中指定了開始讀取紋理數據的位置;緩存區里的數據,是源緩存區通過glReadBuffer設置的。

//使用函數分配紋理對象
//指定紋理對象的數量 和 指針(指針指向一個屋符號整形數組,由紋理對象標識符填充)。
void glGenTextures(GLsizei n, GLint *texTures);

//綁定紋理狀態
//參數target: GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
//參數texture:需要綁定的紋理對象
void glBindTexture(GLenum target, GLunit texture);

//刪除綁定紋理對象
//紋理對象 以及 紋理對象指針(指針指向一個無符號整形數組,由紋理對象標識符填充)。
void glDeleteTexture(GLsizei n, GLint *textures);

//測試紋理對象是否有效
//如果texture是一個已經分配空間的紋理對象。那麼這個函數會返回GL_TRUE,否則返回GL_FALSE.
GLboolean glIsTexture(GLuint texture);

glTexParameterf(GLenum target, GLenum pname, GLFloat param);
glTexParameteri(GLenum target, GLenum pname, GLint param);
glTexParameterfv(GLenum target, GLenum pname,GLint param);
glTexParameteriv(GLenum target, GLenum pname, GLint *param);

參數1:target,指定這些參數將要應用在那個紋理模式上,比如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
參數2:pname,指定需要設置那個紋理參數。
參數3:param,設定特定的紋理參數值。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
//紋理縮小時,使用鄰近過濾

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GLLINEAR)
//紋理放大時,使用線性過濾

參數1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
參數2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,針對s,t,r坐標
參數3:GL_REPEAT、GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER
GL_REPEAT:OpenGL在紋理坐標超過1.0的方向上對紋理進行重復;
GL_CLAMP:所需要的紋理單元取自紋理邊界或TEXTURE_BORDER_COLOR.
GL_CLAMP_TO_EDGE環繞模式強制對范圍之外的紋理坐標沿著合法的紋理單元的最後一行或者最後一列來進行采樣。
GL_CLAMP_TO_BORDER:在紋理坐標在0.0到1.0范圍之外的只使用邊界紋理單元。邊界紋理單元是作為圍繞基本圖像的額外的行和列,並與基本紋理圖像一起載入的。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE);

OpenGL像素格式

像素數據的數據類型

//設置mip貼圖基層
glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);
//設置mip貼圖最大層
glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_LEVEL,0);

GLint comFlag;
//判斷紋理是否被成功壓縮
glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);

//根據選擇的壓縮紋理格式,選擇最快、最優、自行選擇的演算法方式選擇壓縮格式
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST);
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST);
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);

void glCompressedTexImage1D(GLenum target,GLint level,Glenum internalFormat,GLsizei width,GLint border, GLsizei imageSize, void *data);

void glCompressedTexImage2D(GLenum target,GLint level, GLenum internalFormat, GLsizei width, GLint height, GLint border, GLsizei imageSize, void *data);

void glCompressedTextImage3D(GLenum target, Glint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,GLint border, GLsizei imageSize,void *data);

target: GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D.
level:指定所載入的mip貼圖層次。一般我們都把這個參數設置為0.
internalformat:每個紋理單元中存儲多少顏色成分
width、height、depth參數:指載入紋理底層的寬度、高度、深度。注意:這些值必須是2的整數次方。(這是因為舊版本上遺留下的一個要求。當然現在已經可以支持不是2的整數次方。但是開發者還是習慣使用2的整數次方去設置參數)
border參數:允許為紋理貼圖指定一個邊界寬度。
format、type、data參數:與我們在講glDrawPixels函數對應的參數相同

② openGL的glReadPixels獲取的是初始化時的像素嗎

SetPixel 是win32的GDI函數。不是opengl函數,所以用glReadPixel肯定讀不到。得用GetPixel來讀取像素。

學習這個填充演算法可以不用OpenGL,使用win32的GDI就可以了。這樣簡單一些。

如果想要使用opengl,可以用glDrawPixels和glReadPixels來讀寫像素,只不過這兩個函數用起來稍微復雜一些,另外還需要先初始化OpenGL環境。

③ opengl .畫筆軟體中的填充採用的是什麼方法

區域填充演算法

④ opengl 用圖片進行區域填充

假設是一個正六邊形的填充

void glMain()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0.0f, 0.0f, -3.0f);

glColor3f(0.0f, 0.0f, 0.0f);

/* 繪制一個指定圖案填充的矩形 */

//啟用圖案填充

glEnable (GL_POLYGON_STIPPLE);

//指定使用哪種圖案

glPolygonStipple (aoyun);

glBegin(GL_POLYGON); //六邊形

glVertex3f(1.0, 0.0, 0.0);

glVertex3f(0.5, 0.866, 0.0);

glVertex3f(-0.5, 0.866, 0.0);

glVertex3f(-1.0, 0.0, 0.0);

glVertex3f(-0.5, -0.866, 0.0);

glVertex3f(0.5, -0.866, 0.0);

glEnd();

SwapBuffers(g_hDC);

}

⑤ opengl 邊界填充演算法

我這邊好像不更改窗體大小就不會卡住啊
莫非是你讓它睡了10秒誤以為是卡住?

⑥ 怎麼用opengl掃描線演算法填充多邊形

掃描線演算法是光柵圖形學的內容,底層硬體實現。opengl是不會關注這種細節的。你寫這樣的代碼
glBegin(GL_POLYGON);
glVertex3f(...);
...
glVertex3f(...);
glEnd();
畫一個多邊形,但底層的光柵化到底是怎麼實現的,是否使用掃描線演算法,你是不可以控制的。

⑦ openGL中的glReadPixels函數問題

了解下glReadPixels參數的含義:
void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid *pixels) ;

前面幾個參數指定讀取的位置尺寸以及格式, 最後一個參數用來返回結果, 所以像素數據自然是讀到pixels中。

熱點內容
安卓10支持哪個聖安地列斯 發布:2023-02-05 15:34:11 瀏覽:704
mutexpython 發布:2023-02-05 15:33:55 瀏覽:464
oraclesql總結 發布:2023-02-05 15:33:06 瀏覽:204
如何配置routerA 發布:2023-02-05 15:29:00 瀏覽:787
紅米手機存儲路徑 發布:2023-02-05 15:27:47 瀏覽:789
用友t3伺服器ip地址和密碼 發布:2023-02-05 15:21:12 瀏覽:329
dell伺服器帶外口地址 發布:2023-02-05 15:14:00 瀏覽:750
金稅盤的安全接入伺服器地址沈陽 發布:2023-02-05 15:11:59 瀏覽:147
php獲取年份 發布:2023-02-05 15:10:36 瀏覽:774
微信怎麼上傳一秒視頻 發布:2023-02-05 15:10:33 瀏覽:189