ฉันคิดว่ามันใช้งานได้แล้ว แต่ยังไม่ทราบวิธีเปลี่ยนค่าในจุดยอดเชเดอร์ของฉัน สิ่งที่ฉันทำใน opengl มีดังต่อไปนี้สำหรับการเรนเดอร์แต่ละครั้ง:
//i bind my shader
shader.bind();
// Then trying to set the value in my vertex shader like so:
GLuint test = glGetUniformLocation(shader.id(), "Test");
glUniform1f(test, 6.0f);
// Do some other stuff like rendering an object
// ...
// then unbind shader
shader.unbind();
นี่คือค่าที่ฉันต้องการเปลี่ยนในจุดยอดของฉัน:
uniform float Test = 0.66; // Doesn't work
//const float Test = 0.66; // Works
แต่เชเดอร์ของฉันไม่ทำงานเมื่อฉันลอง มันทำให้วัตถุของฉันเป็นสีดำ
ถ้าฉันแสดงความคิดเห็นส่วน glGetUniform(Location) ออกและหากใช้ float เป็น const แทนที่จะเป็น < strong>สม่ำเสมอ จากนั้นเชดเดอร์ของฉันก็ทำงานได้ดี แต่ฉันต้องการที่จะเปลี่ยนค่าในเชเดอร์ของฉันในการเรนเดอร์แต่ละครั้ง ฉันว่าฉันต้องใช้เครื่องแบบเพื่อสิ่งนั้น...?
มีบางอย่างที่ฉันขาดหายไป..??
แก้ไข:
ดูเหมือนว่าฉันได้รับข้อผิดพลาด GLSL ต่อไปนี้:
การแสดงออกที่ไม่คงที่ในการเริ่มต้น
ดังนั้นจึงต้องคงที่จึงจะทำงานได้... นั่นหมายความว่าไม่มีทางที่จะให้สิ่งนี้เป็นค่าไดนามิก..?
นี่คือ Vertex Shader ของฉัน:
const float FresnelPower = 1.0;
uniform float Eta; // <---- MUST BE CONSTANT...
const float F = ((1.0-Eta) * (1.0-Eta)) / ((1.0+Eta) * (1.0+Eta));
varying vec3 Reflect;
varying vec3 Refract;
varying float Ratio;
void main()
{
vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
vec3 ecPosition3 = ecPosition.xyz / ecPosition.w;
vec3 i = normalize(ecPosition3);
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
Ratio = F + (1.0 - F) * pow((1.0 - dot(-i, n)), FresnelPower);
Refract = refract(i, n, Eta);
Refract = vec3(gl_TextureMatrix[0] * vec4(Refract, 1.0));
Reflect = reflect(i, n);
Reflect = vec3(gl_TextureMatrix[0] * vec4(Reflect, 1.0));
gl_Position = ftransform();
}