【发布时间】:2012-02-21 02:55:08
【问题描述】:
我以为我已经成功了,但我仍然不知道如何更改我的顶点着色器中的值。对于每个渲染,我在 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) 部分注释掉并且如果使用浮动作为 const uniform 那么我的着色器工作正常。但我希望能够在每次渲染中更改我的着色器中的值。虽然我不得不为此穿制服...?
我有什么遗漏吗..??
编辑:
显然我收到以下 GLSL 错误:
初始化中的非常数表达式
所以它必须保持不变才能工作......这是否意味着没有办法将它作为动态值......?
这是我的顶点着色器:
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();
}
【问题讨论】: