我使用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上着色器程序的內存塊。
「* C++和GLSL 410中的OpenGL 4.5 *」爲什麼在GLSL 4.10中使用4.5?你不能使用GLSL 4.50嗎? –
我一直在使用的指南有點過時,所以他們指定了4.10。我將開始使用4.50。 – Rob