2012-01-28 24 views
1

私はそれが動作していると思っていましたが、私の頂点シェーダの値を変更する方法はまだ分かりません。私はOpenGLで行うことは、それぞれのために、以下れるレンダリング:頂点シェーダ(GLSL)の浮動小数点の変更

//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(場所)部分をコメントアウトし、その後、均一の代わりのconstとしてfloatを使用している場合、私のシェーダが正常に動作している場合

。しかし、私は各レンダリングでシェーダの値を変更できるようにしたい。私はそのために制服を使わなければならなかった...?

私には何かがありますか?


EDIT:

Appearently私は、次のGLSLエラーを取得しています:

non constant expression in initialization

だから、それが動作するためには一定でなければならない...それはありませんがあることを意味してい動的な価値としてこれを持つ方法..?

これは私のバーテックスシェーダです:あなたはこのような頂点シェーダであなたの制服を宣言しなければなりません

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(); 
} 

答えて

1

:また

uniform float Test; 

、あなたが呼び出す前に、あなたのプログラムのオブジェクトハンドルでglUseProgram()を呼び出す必要がありますglUniform1f()ですので、ご自身のshader.bind()の内容を確認してください。 glGetUniformLocation()に一度電話して結果をキャッシュすれば十分です。また、OpenGL呼び出しのエラーをglGetError()でチェックし、他のすべてが正しく機能していることを確認してください。あなたの編集に返信

は、私は、この行が問題だと思う:

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

constは、一定の時間をコンパイルすること、のように、値が均一で変更することはできません。 Fは、一様変数が(コンパイル時の)定数ではないため、定数にすることはできません。 Fを宣言した行をmainの本文に移動し、const修飾子を削除します。その後、シェーダが動作するはずです。

+0

私はglGetError()でチェックして、シェーダ(glUserProgram)をバインドしようとするとエラーが表示されました。私はさらに少しデバッグし、私はglslコンパイルエラーがあることに気づいた。最初の投稿を詳細に編集しました。多分あなたはその答えを知っているでしょうか? – w00

1
uniform float Eta;   // <---- MUST BE CONSTANT... 

GLSLは "定数" と言うとき、その意味するコンパイル時定数です。 Etaの値は、特定のドローコール内で確実に均一です。しかし、それはの間で変更することができるので、一定ではありません。コンパイラは、この値がコンパイル時にどのようになるかを知らない。

const変数は、コンパイル時間定数です。したがって、コンパイル時定数のみで構成される式で初期化する必要があります。 uniformはコンパイル時定数ではないため、変数constを初期化することはできません。

関連する問題