簡體   English   中英

在 OpenGL 中,我可以在坐標 (5, 5) 處繪制一個像素嗎?

[英]In OpenGL, can I draw a pixel that exactly at the coordinates (5, 5)?

(5, 5) 我的意思是第五行和第五列。

我發現使用屏幕坐標繪制東西非常困難,OpenGL 中的所有坐標都是相對的,通常在 -1.0 到 1.0 之間。 為什么阻止程序員使用屏幕坐標/window坐標這么嚴重?

最簡單的方法可能是通過glOrtho設置投影以匹配渲染空間的像素尺寸。 然后頂點可以在像素坐標中。 不利的一面是調整 window 的大小可能會導致問題,並且您主要是在浪費加速轉換。

假設 window 為 640x480:

// You can reverse the 0,480 arguments depending on you Y-axis 
// direction preference
glOrtho(0, 640, 0, 480, -1, 1);

幀緩沖區對象和紋理是另一種途徑,但您必須創建自己的光柵化例程(畫線、圓、bitmap 等)。 有可能的庫。

@dandan78 OpenGL 不是矢量圖形渲染器。 是光柵化器。 並且以更精確的方式是通過 C 語言界面描述的標准。 光柵化器,將 3D 坐標空間(汽車、樹、球體、龍)中表示的對象映射到 2D 坐標空間(比如平面、您的應用程序 window 或您的顯示器),這些 2d 坐標屬於離散坐標平面。 光柵化的計數器渲染方法是Ray Tracing。

矢量圖形是一種通過數學函數以非離散方式表示一組曲線、直線或類似幾何圖元的方法。 所以矢量圖形是在“模型表示”領域而不是“渲染”領域。

您可以通過將模型視圖矩陣設置為標識並將投影設置為正交投影(請參閱我對這個問題的回答)來更改“相機”以使 3D 坐標與屏幕坐標匹配。 然后,您可以在所需的屏幕坐標處繪制單點圖元。

您還可以使用 glWindowPos 設置光柵glWindowPos (它適用於屏幕坐標,與glRasterPos不同),然后僅使用glDrawPixels繪制 1x1 像素圖像。

glEnable( GL_SCISSOR_TEST );
glScissor( 5, 5, 1, 1 ); /// position of pixel
glClearColor( 1.0f, 1.0f, 1.0f, 0.0f ); /// color of pixel
glClear( GL_COLOR_BUFFER_BIT );
glDisable( GL_SCISSOR_TEST );

通過更改 glScissor 的最后 2 個 arguments,您還可以繪制像素完美矩形。

幾年前我做了一些 3D 編程,雖然我遠非專家,但我認為您忽略了經典位圖DrawPixel(x, y)圖形與使用 Direct3D 和 OpenGL 完成的圖形類型之間的一個非常重要的區別.

在 3D 之前的日子里,計算機圖形主要是關於位圖,也就是說 collections 的彩色點。 這些點與顯示器上的像素具有 1:1 的關系。

然而,這有許多缺點,包括使 3D 變得非常困難,並且需要不同大小的位圖來實現不同的顯示分辨率。

在 OpenGL/D3D 中,您正在處理矢量圖形。 線由 3 維坐標空間中的點定義,形狀由線定義,等等。 表面可以有紋理,可以添加燈光,也可以添加各種類型的照明效果等。然后可以通過虛擬相機查看整個場景或其中的一部分。

盡管這個虛擬相機“看到”的是場景到 2D 表面的投影。 此時我們仍在處理矢量圖形。 但是,由於計算機顯示器由離散像素組成,因此必須對該矢量圖像進行光柵化,從而將矢量轉換為具有實際像素的 bitmap。

總而言之,您不能使用屏幕/窗口坐標,因為 OpenGL 是基於矢量圖形的。

我知道我參加聚會很晚了,但以防萬一將來有人有這個問題。 我使用這些將屏幕坐標轉換為 OpenGL 矩陣坐標:

double converterX (double x, int window_width) {
    return 2 * (x / window_width) - 1;
}

double converterY (double y, int window_height) {
    return -2 * (y / window_height) + 1;
}

這基本上是重新縮放的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM