2016-01-04 30 views
2

如果我有一個簡單的OpenGL着色器一次應用於多個立方體,那麼統一值變慢。我已經注意到像glColor3f這樣的東西並沒有減慢它的速度(至少從我嘗試過的速度來看),但是目前使用glColor3f作爲一種破解方式,以便着色器可以讀取gl_Color,我可以使用它來類似於制服用於確定立方體的哪一側正被渲染用於面部獨立的平面照明。渲染之前設置的OpenGL着色器訪問的值是什麼?

我使用的是displaylists,所以我使用了glColor3f,因爲它會烘焙到列表中,並且在創建列表時只是在每張臉前做了不同的顏色。現在,我想在渲染之前設置更多的值(這次不在顯示列表中)。

來自OpenGL的調用可以在着色器中讀取嗎​​?我需要在渲染之前將0-8的6個整數送入着色器,但我可能稍後設法縮小。

+2

如果您使用現代OpenGL,而不是嘗試將固定功能管道('glColor3f')和過時的API(顯示列表)與新功能(着色器)混合匹配,則這種事情會容易得多。通常,您可以定義屬性,制服,統一緩衝區,紋理,着色器存儲緩衝區等的組合,着色器可以讀取所有這些。這聽起來像你想要的屬性。 –

回答

2

我建議使用統一的塊或制服與數據類型ivec2ivec3ivec4,他們可以寫2,3或4 int一次。

從這個Aapart有一些內置的制服。除了基質,這些都是gl_DepthRangegl_Foggl_LightSource[gl_MaxLights]gl_LightModelgl_FrontLightModelProductgl_BackLightModelProductgl_FrontLightProduct[gl_MaxLights]gl_BackLightProduct[gl_MaxLights]gl_FrontMaterialgl_BackMaterialgl_Pointgl_TextureEnvColor[gl_MaxTextureUnits]gl_ClipPlane[gl_MaxClipPlanes]gl_EyePlaneS[gl_MaxTextureCoords]gl_EyePlaneT[gl_MaxTextureCoords]gl_EyePlaneR[gl_MaxTextureCoords]gl_EyePlaneQ[gl_MaxTextureCoords]gl_ObjectPlaneS[gl_MaxTextureCoords]gl_ObjectPlaneT[gl_MaxTextureCoords]gl_ObjectPlaneR[gl_MaxTextureCoords]gl_ObjectPlaneQ[gl_MaxTextureCoords]

但是,從着色器讀取全局數據的預期方式是統一變量。另一種方法是將信息編碼爲紋理。

+0

使用VBO和其他更新的渲染方法有助於加快速度嗎?我正在製作類似於Minecraft的東西,以獲得樂趣和學習。我有Frustum剔除,它不會完全包圍塊,所以如果不通過制服,我可以得到一個相當不錯的幀率。現在我想爲個人臉部實現平面照明,我做了我說的控制臉部照明的東西。它有效,但如果我有足夠的塊,那麼它比我想要的更多。但是,如果我設置了近距渲染距離,則系統確實可以工作。 –

+0

@Cello Code我對VBO的經驗不多。我建議閱讀這個問題的答案[在使用VAO時是否在VBO中交錯加速性能](http://stackoverflow.com/questions/18853713/does-interleaving-in-vbos-speed-up-performance-when-using -vaos?RQ = 1) – Rabbid76