【问题标题】:change float in vertex shader (GLSL)更改顶点着色器(GLSL)中的浮点数
【发布时间】: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();
}

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    你必须像这样在顶点着色器中声明你的制服:

    uniform float Test;
    

    另外,在调用glUniform1f() 之前,您必须使用您的程序对象句柄调用glUseProgram(),因此请确保您的shader.bind() 就是这样做的。如果你调用一次glGetUniformLocation() 并缓存结果就足够了。此外,请使用glGetError() 检查您的 OpenGL 调用错误,以确保其他一切正常。

    回复您的编辑,我认为这行是您的问题:

    const float F  = ((1.0-Eta) * (1.0-Eta)) / ((1.0+Eta) * (1.0+Eta));
    

    const 表示编译时间常数,例如,该值不能被统一更改。 F 不能是常量,因为统一变量不是(编译时)常量。将声明F 的行移动到main 的正文并删除 const 限定符。那么你的着色器应该可以工作了。

    【讨论】:

    • 我试过你说的,我检查了 glGetError(),当我尝试绑定着色器 (glUserProgram) 时它给了我一个错误。我进一步调试了一下,发现我得到了一个 glsl 编译错误。我已经用更多细节编辑了我的第一篇文章。也许你知道答案?
    【解决方案2】:
    uniform float Eta;         // <---- MUST BE CONSTANT...
    

    当 GLSL 说“常量”时,它的意思是 编译时间 常量。 Eta 的值在特定的绘制调用中肯定是统一的。但它不是恒定的,因为它可以改变 between 绘制调用。编译器在编译时不知道这个值是什么。

    const 变量是一个编译时间 常量。因此,它必须使用仅由编译时常量组成的表达式进行初始化。 uniforms 不是编译时常量,所以你不能用它们初始化 const 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多