2013-03-30 76 views
2

我正在製作一個使用點精靈的小型OpenGL Mac應用程序。我使用一個頂點數組來繪製它們,並且我想使用一個類似的「數組」函數來爲它們提供所有不同的大小。如何在OpenGL中繪製不同大小的點精靈?

在OpenGL ES中,有一個名爲GL_POINT_SIZE_ARRAY_OES的客戶端狀態和一個對應的函數glPointSizePointerOES(),它們完全符合我的要求,但似乎無法在標準OpenGL中找到等價物。

OpenGL是否以任何方式支持它?

回答

2

爲了擴大一點上奮的回答,正是你想要的固定功能的OpenGL管道不能做。它可以做'透視'點,隨着Z距離的增加而變小,但僅此而已。

對於每個頂點的任意點大小,您需要一個自定義頂點着色器來設置每個頂點的大小。將點的大小作爲屬性數組傳遞(重新使用曲面法線或tex座標,或使用自己的屬性索引)或在紋理貼圖中傳遞,例如寬度等於點數組大小的一維紋理。 Fen引用的着色器代碼示例使用紋理貼圖技術。

+0

感謝您的提示!我以前從未使用過着色器,只有對它們有基本的瞭解,所以這似乎是一個很好的機會讓我的腳溼潤。 –

2

的OpenGL不支持此蘋果擴展,但你可以做到這一點以外的其他方式:

對於固定管道:(的OpenGL 1.4及以上)

您需要設置點參數:

float attenuation[3] = {0.0f, 1.0f, 0.0f};  
glPointParameterfvEXT(GL_POINT_DISTANCE_ATTENUATION, attenuation); 

glPointParameterfEXT(GL_POINT_SIZE_MIN, 1.0f); 
glPointParameterfEXT(GL_POINT_SIZE_MAX, 128.0f); 

glEnable(GL_POINT_SPRITE); 

的OpenGL將計算點大小爲你這樣

個着色器

下面是渲染着色器使用一些信息: http://en.wikibooks.org/wiki/OpenGL_Programming/Scientific_OpenGL_Tutorial_01

+0

嗨,感謝您的回覆!點參數路由似乎可能是我試圖完成的髒修復(這是關於實際大小,而不是透視圖)。我想我必須開始閱讀着色器。無論如何,這是關於時間的。 –

+0

固定管道是舊的方式......但將工作。如果你有更多的時間,我建議實現它的着色方式 – fen

1

如果通過「OpenGL支持這個」,你的意思是「我可以在OpenGL中做那樣的事情」,絕對是。

使用着色器。傳遞一個代表點大小的1維通用頂點屬性。在頂點着色器中,將該點大小設置爲頂點着色器的輸出gl_PointSize。這真的很簡單。

如果你的意思是「固定功能的OpenGL支持這個」,否。