2011-10-22 78 views
2

我以前用'per pixel'繪製小遊戲, 我是指一些SetPixel(x,y,color)函數等。每個像素在OpenGL中繪圖

我也對OpenGL感興趣,但不太瞭解它。

這是一個很好(快速)的方式來做OpenGL中的每像素繪圖?

這將是很好的例子,使用紋理四邊形作爲一個精靈, 或整個應用程序的背景畫面,與可能性 設定不同的像素以某種我自己SetPixel日常 我會寫......或任何其他方式 - 但它應該是高效 一樣,因爲它罐

(特別是具有即時通訊感興趣的基本fundamenta 1.0版本OGL)的

+0

順便說一下,OpenGL 1.0聽起來可能是最基本的,但實際上OpenGL 1.1實際上是最不常見的分母。我從來沒有見過一個平臺不支持至少1.1(並且是軟件)。在1.0中你沒有紋理對象,也沒有頂點數組。 –

+0

好吧,tnx多,它很好知道 –

回答

0

你真的不希望這樣做。

這是一個很好(快速)的方式來做OpenGL中的每像素繪圖?

有沒有好的或快速的方法來做到這一點。由於速度,它非常灰心。

雖然在OGL 1中並不容易(或在某些情況下可能),但正確的方法是使用像素着色器或混合模式。這是唯一正確的方法,其他任何方法都是針對整個系統進行黑客攻擊。

根據數據需要修改的方式,頂點顏色和混合模式可能能夠解決某些用途。它不會單獨爲每個像素着色,但您可以更快地修改紋理。要做到這一點,您可以繪製單像素四邊形(雖然必須注意抵消它們並處理濾波以防止模糊),或者您可以獲取紋理數據並在稍後對其進行處理。兩者都會令人難以置信的緩慢,但可以發揮作用。

使用紋理數據可能更簡單,可能會稍微快一點。

+1

這並沒有真正回答這個問題,尤其是因爲他想要OGL 1.0。 – Pubby

+0

着色器不適合我,因爲我正在談論非常基本的基本ogl 1.0或最大1.3;你提到的最後一個選項,如果我的意思是從gpu到ram和back的'整個紋理傳輸'也是不好的 - 這是否意味着它可能不是快速但只有溫和的方式是不可能的?非常壞的消息 –

+0

「這並沒有真正回答這個問題」,但它對tnx很有用,但可能還有一些可以通過 –

6

您可以設置投影,將地圖的頂點座標1:1像素座標:

glViewport(0, 0, window_width, window_height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, window_width, 0, window_height, -1, 1); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

從這裏開始,頂點X,Y座標是在左下角的原點像素。理論上你可以使用GL_POINT原語的直接模式。但是批量處理是一個更好的主意。相反發送各點來逐個創建所有你想畫點的數組:

struct Vertex 
{ 
    GLfloat x,y,red,green,blue; 
}; 

std::vector<Vertex> vertices; 
/* fill the vertices vector */ 

這個你可以OpenGL的點...

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

/* Those next two calls don't copy the data, they set a pointer, so vertices must not be deallocated, as long OpenGL points to it! */ 
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].x); 
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].red); 

...並把它接入和平局這一切單個電話:

glDrawArrays(GL_POINTS, 0, vertices.size(); 
+0

很多TNX,我會檢查這個 - 但是這個數組可能對很多像素圖很大,比如說10k 100k 1M?我可以將它刪除到0並用我的像素繪製例程來填充它,每個幀都是? –

+1

@ user982377:好吧,你不應該用它來繪製整個圖片(使用紋理),它更像繪製一個情節。從技術上講,索引數據類型只有限制,但性能方面,由於性能原因,您不應該批量增加2^16個點以上。用新數據填充是沒有問題的,但是在調整基址後,可能會改變,因此需要重置。重點是:操縱單個像素對於稀疏圖像處理只有意義。如果你正在做批量業務,那麼紋理就是要走的路。 – datenwolf

+1

@ user982377:另外不要忘記計算這些新像素所需的CPU功率。計算每個幀1M個新值可能會使GPU停滯不前,因爲CPU無法跟上它。你應該告訴我們,你打算做什麼,所以我們可以提出更好的建議。 – datenwolf