シンプルキューブの現在のシーンにライティングを追加しようとしています。 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の呼び出しを移動しました。助けをいただきありがとうございます。
フラグメントシェーダーの '#version'ディレクティブはどこですか? – genpfault
偶然に誤って – user2227713