2012-03-09 18 views
1

我使用一些與我的OpenGL ES仿真器一起提供的演示作爲起點。我目前使用的演示是960x540像素,在屏幕中間繪製了一個簡單的2D三角形。什麼決定了OpenGL ES 2.0中的屏幕網格的尺寸? (使用C++)

我看到三角形已經用浮動畫出,屏幕的左下角是(-1,-1),而屏幕的右上角是(1,1)。

可以改變這個嗎?我想用整數而不是浮點數,並且屏幕的左下角爲(1,1),而右上角爲(960,540)。

因爲我打算製作2D平臺遊戲,所以這會容易得多。我不想在這個遊戲中分割任何像素;一切(紋理,玩家移動,相機移動)都將符合全像素座標。

我試着嘎吱嘎吱的數字(使用常規網格和浮點數)繪製一個24x24像素的直角三角形。但是,它最終在屏幕上是24x23像素。所以我不想繼續前進,如果有更準確,更快的方法可以使用像素座標。

回答

0

從頂點着色器出來的值應該準備投影到普通的OpenGL眼圖空間中,但不需要在該空間中傳遞頂點。在ES 1中,你已經調整了投影堆棧;你的演示有沒有類似的東西?

您還應該考慮填充規則。如果像素的中心位於幾何圖形內,則像素總是被填充;如果它的中心位於邊界上,那麼實現將通常根據像素在哪個邊界上 - 頂部,底部,左側或右側邊界來做出決定(如果按照像素輸出來考慮,這會更有意義;因此,左邊界上的像素是第一個在掃描線上的像素,右側的像素將是最後一個像素,頂部的像素將開始多邊形在屏幕的上方,底部的像素會將其向下延伸)。

目標是OpenGL不會在幾何圖形在邊緣上遇到兩次時繪製像素。因此,三角形的高度可以是24個像素單位,但如果它從一個像素的中心到另一個像素的中心,它將只繪製[最多] 23行。所以你的數學可能已經是正確的了。考慮從y = 0到y = 24的一個多邊形和從y = 24到y = 36的多邊形 - 你不希望它們都在y = 24處繪製,特別是因爲它們可能部分透明。

+0

演示確實有4x4矩陣,註釋:「用於投影模型視圖的矩陣」。它的對角線上有1,下降到其他地方的零。你會推薦我在那裏放什麼號碼? – Jourgen 2012-03-09 23:20:15

+0

按照我輸入的方式思考,我想你想用2/960來縮放x,所以把它放在左上方,y放2/540,然後沿着主對角線放置下一個,然後你想把中心移到底部左邊,所以在x上是負數,在y上是負數,在每種情況下都是-1,所以這些會在最後一列的前兩位中出現。在標準GL術語中,作爲將是{2.0f/960.0f,0.0f,0.0f,0.0f,0.0f,2.0f/540.0f,0.0f,0.0f,0.0f,0.0f,1.0 f,0.0f,-1.0f,-1.0f,0.0f,1.0f} – Tommy 2012-03-09 23:31:44

+0

剛試過你的矩陣,它的工作完美。現在,我繪製的所有形狀都完全取決於我所期望的形狀。謝謝! – Jourgen 2012-03-09 23:59:54

2

您可以使用正交投影矩陣應用適當的變換,其中的範圍設置爲您的分辨率。

如何使這樣的矩陣:http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

應用在頂點着色器此轉換,使您可以直接在頂點數據提供像素COORDS。

棘手的部分是,在這種情況下,像素(其中的中心)不在整數位置! 這是事情通常變得奇怪的地方=>適當的搜索詞可能是'像素完美的OpenGL'。

0.5添加到頂點着色器中的像素座標中,然後可以將其作爲整數提供,應該可以做到。請注意,在頂點着色器中,必須將整數頂點座標轉換爲浮點數,如果通過浮點數,則應該先舍入()它們。

如果你要提供標準化的座標,{1,-1} - {1,1},你現在就這樣做(我不建議):

vec2 pixelSize   = 2.0/vec2(viewportWidth,viewportHeight); 
vec2 halfPixelSize  = 1.0/vec2(viewportWidth,viewportHeight); 
vec2 pixelPerfectCoord = round(coord,pixelSize) + halfPixelSize 
+3

有什麼有助於理解奇怪的是將OpenGL座標視爲_continuous_空間(浮點數而不是整數)。像素是小方塊,整數座標在像素之間。這就像標尺上的刻度線,像素是刻度線之間的空格。 – Thomas 2012-03-09 22:47:07

+0

現在我想到了,擊中中心的像素非常有意義。您提供的鏈接對理解投影矩陣也有非常有用的圖像(圖像的標題爲:「Matrix 4x4和四元數的可視化表示」)。感謝您的答案。 – Jourgen 2012-03-09 23:56:50