2013-03-30 9 views
7

シンプルキューブの現在のシーンにライティングを追加しようとしています。 OpenGLシェーダエラー1282

// per-fragment interpolated values from the vertex shader 
varying vec3 fN; 
varying vec3 fL; 
varying vec3 fE; 

uniform vec4 ambientProduct, diffuseProduct, specularProduct; 
uniform mat4 mTransform; 
uniform vec4 lightPosition; 
uniform float shininess; 

void main() 
{ 
    // Normalize the input lighting vectors 
    vec3 N = normalize(fN); 
    vec3 E = normalize(fE); 
    vec3 L = normalize(fL); 

    vec3 H = normalize(L + E); 

    vec4 ambient = ambientProduct; 

    float Kd = max(dot(L, N), 0.0); 
    vec4 diffuse = Kd*diffuseProduct; 

    float Ks = pow(max(dot(N, H), 0.0), shininess); 
    vec4 specular = Ks*specularProduct; 

    // discard the specular highlight if the light's behind the vertex 
    if(dot(L, N) < 0.0) { 
    specular = vec4(0.0, 0.0, 0.0, 1.0); 
    } 

    gl_FragColor = ambient + diffuse + specular; 
    gl_FragColor.a = 1.0; 
} 
fragment.glsl
#version 120 

attribute vec4 coord3d; 
attribute vec3 normal3d; 

// output values that will be interpretated per-fragment 
varying vec3 fN; 
varying vec3 fE; 
varying vec3 fL; 

uniform vec4 lightPosition; 
uniform mat4 mTransform; 

void main() 
{ 
    fN = normal3d; 
    fE = coord3d.xyz; 
    fL = lightPosition.xyz; 

    if(lightPosition.w != 0.0) { 
    fL = lightPosition.xyz - coord3d.xyz; 
    } 

    gl_Position = mTransform*coord3d; 
} 

vertex.glsl:私の制服を設定した後、私は、コードのこの作品のためにglGetError()から1282エラーが出る。ここ
GLuint ambientHandle = glGetUniformLocation(program->getHandle(), "ambientProduct"); 
glUniform4fv(ambientHandle, 1, ambientProduct); 
GLuint diffuseHandle = glGetUniformLocation(program->getHandle(), "diffuseProduct"); 
glUniform4fv(diffuseHandle, 1, diffuseProduct); 
GLuint specularHandle = glGetUniformLocation(program->getHandle(), "specularProduct"); 
glUniform4fv(specularHandle, 1, specularProduct); 
GLuint lightPosHandle = glGetUniformLocation(program->getHandle(), "lightPosition"); 
glUniform4fv(lightPosHandle, 1, light.position); 
GLuint shinyHandle = glGetUniformLocation(program->getHandle(), "shininess"); 
glUniform1f(shinyHandle, materialShininess); 

は私のシェーダです

製品と位置はそれぞれ3つのGLフロートの構造体で、シャイニーはフロートです。私はすべてのハンドルの値と私が渡している値をチェックしており、それらはすべて有効と思われます。アイデア?

- EDIT: 私はglUniform4fvコールに絞っています。それはそれぞれの後に起こります。また、私は、プログラム - > getHandle()が有効と思われるものを指していることを二重チェックしました。

私がチェックしたプログ> getHandleは、ここですべてのハンドルの値が有効なプログラム です: プログラムハンドル3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4

だから彼らのすべてよく見える。テストのために、私はambientProductのものの下の行をコメントアウトしています。わかりやすくするために、この行を明示的に使用しています。

glUniform4f(ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w); 

これは、行実行時のambientProdの値です。 x = 0.200000003、y = 0.0、z = 0.200000003、w = 1.0

このプロジェクトの共同作業者はglUseProgramの呼び出しを移動しました。助けをいただきありがとうございます。

+0

フラグメントシェーダーの '#version'ディレクティブはどこですか? – genpfault

+0

偶然に誤って – user2227713

答えて

10

エラー番号'1282 'はあまり説明的ではありません。 glGetUniformLocationため

可能性のあるエラーコードです:固定値を持っていない

GL_INVALID_VALUE 
GL_INVALID_OPERATION 

gluErrorString()でエラー文字列を取得するか、1282のいずれのマップにヘッダーを見てください。

暗闇の中でだけでショット

:しかし、あなたがやった...あなたのシェーダをチェック

  • はエラーなしでコンパイルされてしまいましたか?

  • シェーダーが間違いなくリンクされていることを確認してください。

ところで:戻り値の型は、うーん、これは奇妙に見える

「エラーなしでコンパイルおよびリンクシェーダを」GLuintない輝きです。

は仕様によると(参照:http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml)をGL_INVALID_OPERATIONのみ生成する必要がある場合:プログラムは

  • プログラムが正常にリンクされていないプログラムOBJECではありません

    その他の質問:

    • programオブジェクトが所属するクラスのgetHandle()メソッドが正しいIDを返すことを確認してください。私は、成功してリンクするのに使われたものを意味します。私はあなたの例ではglUniform4fvにこれらの呼び出しを逃した -ああ:

      あなたはglIsProgram(program-getHandle())戻り

    GL_TRUEがEDITかどうかをチェックして検証することができるはずです。

    glGetUniformLocationの正しい返品タイプはまだGLintですが、私はそれが問題ではないと思います。

    スペック(http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml参照)GLUniformXXによれば、理由は一切ありません。GL_INVALID_OPERATIONです。私には、おそらく適用すると思われる唯一のものである:

    • なし現在のプログラムオブジェクトがありません

      あなたは前glUniform()を呼び出すしようとするglUseProgram (program->getHandle())を呼んでいましたか?

  • +0

    GL_INVALID_OPERATIONエラーでコンパイル、リンクされたシェーダ – user2227713

    +4

    あなたの例で 'glUniform()'の呼び出しを逃しました。仕様に列挙されている理由があります。 IMHOプログラムは、おそらく適用される唯一のものと思われるアクティブなものではありません。 – mikyra

    +3

    うわー、私は本当にglUseProgramを呼び出すことを忘れてしまった。 Tnx。 – anhoppe