私は非常にシンプルなフラグメントシェーダを持っている:OpenGL - ユニフォームが正しく渡されていませんか?
#version 330 core
// Interpolated values from the vertex shaders
in vec3 positionW;
// Output data
out vec3 frag_color;
uniform vec3 alsoLightW;
void main(void) {
vec3 temp = normalize(alsoLightW);
frag_color = vec3((temp.x + 1.0)/2, (temp.y + 1.0)/2, (temp.z + 1.0)/2);
}
それがないすべては、私はそれに渡され、その後、0と1の間(それまで私のフラグメントの色を設定した均一なvec3を正規化である - ので、 0ベクトルは0.5,0.5,0.5の色を有する)。私はこのベクトルをC++コードで出力し、renderdocで正しく渡されていることを確認しますが、吐き出す実際の色は一貫して間違っています - 私の制服とは何の関係もないようですが、私には同じ色を与えてくれます。たとえば、私のvec3はyの座標が0であるため、Greenの値が0.5になると予想されますが、renderdocによれば、代わりに何かが得られます。
これはどうしてですか?それは私を夢中にさせてくれて、私のはるかに複雑なシェーダーをまったく動かさないようにしています。
編集:OpenGLのに制服を渡す:
ctx.shader->Enable();
...
glm::vec3 oppOffset = *Object::globalOffset;
oppOffset *= -1;
glUniform3fv(lightLocation, 1, glm::value_ptr(oppOffset));
glm::vec3 norm = glm::normalize(oppOffset);
//Prints the correct information
std::cout << (norm.x + 1)/2 << "," << (norm.y + 1)/2 << "," << (norm.z + 1)/2 << std::endl;
EDIT2:私は、個々の山車としてそれらを渡してみました、と私は前と同じ正確な奇妙な番号を取得しています。 I've uploaded an image of what I mean - 下の数字を残し、私はCOUTから取得していたもの、および右上がRenderDocが私に
を与えているものですされているこれは私の均一な通過が今のように見えるものです:
glm::vec3 norm = glm::normalize(oppOffset);
norm = (norm + glm::vec3(1.0, 1.0, 1.0)) * glm::vec3(0.5, 0.5, 0.5);
float x, y, z;
x = norm.x;
y = norm.y;
z = norm.z;
ctx.shader->uniform1fv("lightx", 1, &x);
ctx.shader->uniform1fv("lighty", 1, &y);
ctx.shader->uniform1fv("lightz", 1, &z);
std::cout << x << "," << y << "," << z << std::endl;
そして、私のシェーダ:
#version 330 core
// Interpolated values from the vertex shaders
in vec3 positionW;
// Output data
out vec3 frag_color;
uniform float lightx;
uniform float lighty;
uniform float lightz;
void main(void) {
//vec3 temp = normalize(alsoLightW);
frag_color = vec3(lightx, lighty, lightz);
}
非常に奇妙な何かが起こっている...
あなたが実際にシェーダにalsoLightW' 'の値を渡すコードを投稿することができますか? – Matso
私は情報を持って投稿を更新しました –
そして、どのように 'lightLocation'が得られましたか?シェイダーはいつ起こるのですか? – lisyarus