2017-02-21 40 views
0

我使用OpenGL 4.5 C++和GLSL 410爲什麼在我可以設置校服之前,我必須「使用」着色器程序?

我遇到了一個問題,最近我在那裏試圖設置着色器程序的統一變量不首先使用着色器程序與glUseProgram。我有一個片段着色器,它帶有一個名爲input_color(我將輸出顏色設置爲vec4)的統一變量,附加到我的shader_program。請注意I 在繪製任何應該使用它的東西之前,在我的主要繪製循環中調用glUseProgram(shader_program)

// set uniforms 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

用這個程序繪製的三角形全是黑色的,而不是我期待的結果。經過一些實驗後,我意識到在制服之前我需要使用該程序。

// set uniforms 
glUseProgram(shader_program); // my change 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

以正確顏色的三角形繪製結果。

我的問題是爲什麼我需要先開始使用該程序?我知道OpenGL的工作原理是狀態機,但在這種情況下,爲什麼當前着色器程序狀態是必需的?畢竟,我明確地將shader_program索引作爲參數傳遞給glGetUniformLocation以獲得input_color的內存索引。

我希望答案能夠幫助我更好地理解OpenGL中的狀態,以及如何利用或管理代表GPU上着色器程序的內存塊。

+0

「* C++和GLSL 410中的OpenGL 4.5 *」爲什麼在GLSL 4.10中使用4.5?你不能使用GLSL 4.50嗎? –

+0

我一直在使用的指南有點過時,所以他們指定了4.10。我將開始使用4.50。 – Rob

回答

3

你不需要。 GL 4.1及以上版本爲您提供glProgramUniform(),其中需要您要修改的程序對象。

+0

謝謝 - 我不知道這個選項存在。那麼,說「glUniform」只知道如何通過查看「正在使用」程序來定位程序,而「glProgramUniform」具有不同程序索引的參數? – Rob

+1

是的,這就是OpenGL總是(歷史上)擁有的「綁定到使用」或「綁定到修改」方法的重點。幸運的是,OpenGL開始擺脫它,贊成直接採用對象修改的功能。這已經在OpenGL 4.5中通過採用'ARB_direct_state_access'擴展完全實現。另見https://www.khronos.org/opengl/wiki/Direct_State_Access – peppe

相關問題