2016-01-31 68 views
0

所以基本上使用GL_POINTS渲染時他們我試圖讓我的周圍像素頭,以及如何的OpenGL與他們交易(如果它適用於質地緩衝區也):試圖瞭解像素和GL_POINTS在OpenGL

這裏是渲染到屏幕後的結果上傳的圖片(我試圖把更多的小的,但我只被允許兩個鏈接)

http://i.imgur.com/hcdloMD.png

http://i.imgur.com/9GBtK9m.png

首先這裏是一個程序我寫和它的結果,當我改變下面的值注:

這裏是處理上傳像素和更新它們的代碼,主要關注價值變量,當我改變它時,我改變了尺寸圖片

glDisable(GL_POINT_SMOOTH); 
    int i = 0, j=0, k=0; 

    GLuint vao; 

    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    GLfloat point[3] = {-1.0f, -1.0f, 0.0f}; 
    GLfloat color[3]; 

    float value = 3.0f; 

    float incrementX = value/640.0f; 
    float incrementY = value/480.0f; 


    while(j<256){ 
     //initialize starting position for x for each line 
     point[0] = -1.0f; 

     //run the width 
     while(k<256){   
     //upload vertex position to GL server 
     glVertexAttrib3fv(0,point);  

     //deals with updating colour 
     color[2] = data[i+0]/255.0f;   //B 
     color[1] = data[i+1]/255.0f;   //G 
     color[0] = data[i+2]/255.0f;   //R 
     //upload texture data to GL server 
     glVertexAttrib3fv(1, color); 

     //draws array 
     glDrawArrays(GL_POINTS, 0, 1); 
     //deals with updating incrementors 
     point[0]+=incrementX; //moving forward in appropriate units for the size of width 
     k++; 
     i+=3; 
     } 
     //restart width 
     k=0;; 
     j++; 
     //update height 
     point[1]+=incrementY;  

    } 

    glXSwapBuffers (dpy, glxWin); 
    sleep(6); 

我的問題是關於實際像素

我明白這一點實際上已經沒有區域,所有的OpenGL看到的是點在2D平面的位置,它使感當它被放大時會發生什麼

然而,當我讓圖像越來越小時,我對像素級別發生的變化感到困惑,當它變得越來越小時,可以說它趨向於0即0.000001

當然,屏幕上的像素有限制?

這是否意味着,當它是給定像素的正常大小的1/100時,opengl實際上是否將像素分開以使圖像適合?

,因爲圖像可以被製造得越來越小到這是一個點

肯定OpenGL是不是還描繪各顏色在屏幕上的一個像素的部分的點?或者是由於點位置始終只在一個像素內而重複繪製到一個像素時所反覆的顏色?

或者一個像素是否進一步分成更小的像素尺寸?

編輯:

我關於有沒有大小不是一個假設,但我從「紅書」

「點由單一的頂點表示讀取的頂點代表一個點對點的假設四維齊次座標因此,一個點確實沒有區域,所以在OpenGL中,它實際上是一個用於顯示(或繪製緩衝區)的正方形區域的模擬。當渲染點時,OpenGL確定 哪些像素是使用一組稱爲 柵格化規則的規則覆蓋該點。柵格化規則OpenGL中的一個點相當簡單 - 如果一個樣本落在以窗口座標中該點位置爲中心的平方內,則該點被認爲覆蓋了一個點。「

,所以我想什麼,我想了解的是這裏的光柵化過程

+1

這是關於我見過的最奇怪,效率最低的OpenGL put-point代碼。本質上它是鞋楦虛擬VAO與繪製調用常量屬性加載和單個原始glDrawArray調用到一個粗略的即時模式重新創建。我的意思是,它是有效的。但是:*爲什麼?*我認爲我們殺死了即時模式,現在你創造了弗蘭肯斯坦的VAO/VBO/drawcall-loop-Immediate-Mode-Zombie怪物的這種可憎之物。對於這個地球上所有的好東西,你爲什麼要這樣做? **爲什麼?** – datenwolf

+0

如果您想要將由像素組成的圖像顯示在屏幕上,請執行以下操作:繪製紋理四邊形。請! – datenwolf

+1

你需要學會在那裏抽象一點,從你眼前的東西回來,專注於如果你想幫助的問題,如果你不知道你不需要侮辱的答案 顯然這不是我的產品的最終版本,顯然這不是我的產品,這是我學習和玩弄opengl ,這不是一個代碼審查,我只是想了解像素時發生了什麼每個像素越小,opengl interpert如何,它是否劃分單個像素,並繪製到他們或別的什麼事情發生? – hopjopper

回答

1

你的假設,即點元都有面積爲零不正確。

點數有大小。它們默認爲1px,但其屏幕空間大小可以通過glPointSize函數或gl_PointSize着色器變量更改。

OpenGL wiki

點被光柵作爲一個給定的窗口空間大小的屏幕對齊正方形。大小可以用兩種方法給出:在最後一個活動頂點處理着色器階段或上下文狀態。要從着色器設置點的大小,請啓用帶參數的glEnableGL_PROGRAM_POINT_SIZE),從程序中設置點的大小。如果GL_PROGRAM_POINT_SIZE已啓用,則點大小來自輸出變量float gl_PointSize。如果它被禁用,則對於基元中的所有點,點大小是恆定的,並且由glPointSize​函數設置。

大小定義了該點的正方形每一側佔用的窗口像素的數量。該點的位置定義了該正方形的中心。