2013-12-16 108 views
1

我正在研究在多個平臺上運行的C#/ OpenGL代碼庫:通過MonoTouch的iOS/OpenGL ES 2.0,通過OpenTK的Windows/OpenGL以及其他平臺。當使用GL_POINTS時,gl_Position設置矩形的中心嗎?

當從四邊形切換到GL_POINTS渲染時,我注意到我正在繪製的矩形在iOS上以偏移量呈現。

看來,在Windows上,gl_Position定義了要繪製的矩形的中心。這是我期待的行爲。

在iOS/OpenGL ES 2.0/MonoTouch上,gl_Position似乎設置矩形的左上角

我花了幾個小時試圖找出原因,因爲當然,我認爲這是由我的代碼中的錯誤引起的。

但在此之前我失去了更多時間:使用GL_POINTS時,gl_Position究竟是什麼定義的?矩形的中心或角落?

回答

2

GL_POINTS不是矩形,首先和最重要的。這是一個簡單的假設,但如果啓用點平滑(不建議使用)或多重採樣,實現可以將它們繪製爲圓形。點基元針對由gl_Position定義的位置進行修剪,但柵格化行爲與描述的here相同。

我最好的猜測是在光柵化過程中與子像素的精度有關,GL ES傾向於有更少的精度,而且必須被捕捉到整數座標的東西行爲會不那麼有利。你可以嘗試一個子像素移位(例如0.375或0.5),看看是否改變了任何東西。 OpenGL和OpenGL ES的兼容實現在光柵化點基元時都遵循相同的規則。

出於好奇,你使用的是什麼磅值?不能保證不支持任何非1.0。加上像點大小粒度,有限範圍和可變光柵化形狀,GL_POINTS實際上是四邊形的一個可憐的替代品。

+0

我爲'gl_PointSize'使用了相當大的值,其中一些超過了100個像素。我要進一步調查,很可能我會回到使用四邊形。 – cheeesus

+1

這對於很多實現來說不起作用。您可以通過這種方式查詢點大小範圍:'GLfloat point_min_max [2]; glGetFloatv(GL_POINT_SIZE_RANGE,point_min_max);'。最小大小爲'point_min_max [0]',最大值爲'point_min_max [1]'。大多數實現將支持** 1.0 **作爲最小值,最大值爲** 63.5 **,但OpenGL僅需要實現才能支持完全** 1.0 **。 –