18

シンプルな立方体の現在のシーンに照明を追加しようとしています。ユニフォームをセットアップした後、このコードの 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 );

ここに私のシェーダーがあります: vertex.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;
}

フラグメント.glsl

// 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;
} 

製品と位置はそれぞれ 3 つの GLfloat の構造体であり、shininess は float です。ハンドルのすべての値と渡す値を確認しましたが、すべて有効に見えます。アイデア?

--編集: glUniform4fv 呼び出しに絞り込みました。それはそれぞれの後に起こります。また、program->getHandle() が有効に見えるものを指していることを再確認しました。

program->getHandle が有効なプログラムであることを確認しました すべてのハンドルの値は次のとおりです。

だからみんないい顔してる。テストのために、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 の呼び出しを移動しました。助けてくれてありがとう。

4

2 に答える 2