C ++コードで2つのuintベクトルの差を取り、intにキャストし、floatにキャストし、GLSLに渡すと、正常にレンダリングされます。しかし、GLSLに違いを与えてキャストさせようとすると、描画しようとしている正方形が実際にズームインされているかのように、画面がほぼ均一な色合いで覆われます。そうです、本当にGLSLでやりたいと思っています。 、方法を確認するだけの場合。また、私の行列とベクトルはEigenオブジェクトにありますが、それが重要かどうかはわかりません。
とにかく、それを明確にするために、私のprojviewMatrix(どちらの場合も同じ)は、乗算する同一のfloatベクトルが与えられたときに完全に正常に機能します。したがって、問題はGLSLのuintベクトル減算にあると確信しています。シェーダーで行うのとまったく同じ操作(uintベクトル減算、intへのキャスト、floatへのキャスト)をc ++で実行しましたが、1つは機能し、もう1つは機能しませんでした。
これが私が現在試している頂点シェーダーです。ベクトルは符号付きの整数と見なし、演算は同じである必要があるため、減算を実行してみました...と思います。動作に変化はありません。
#version 150 core
uniform mat4 projviewMatrix;
uniform ivec3 camera;
in ivec3 in_Position;
in vec3 in_Color;
out vec3 pass_Color;
void main()
{
gl_Position = projviewMatrix * vec4(in_Position - camera, 1.0);
pass_Color = in_Color;
}
私はパスin_Position
しcamera
てuvec3sとして試した後ivec4(in_Position - camera, 1)
、他のさまざまなばかげた再配置を行っても無駄になりました。また、名前をに変更camera
してみましたin_Camera
。認めます、それは必死でした。
私の制服通過物。作業フロートベクトルを渡すときは、2つのカメララインをコメントアウトするだけです。
GLint viewLoc = glGetUniformLocation(shader.id(), "projviewMatrix"); //this is an ortho projection with 1/2 scaling, no rotation or translation
GLint cameraLoc = glGetUniformLocation(shader.id(), "camera");
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, projview.data());
glUniform3uiv(cameraLoc, 1, camera.pos.data());
これが、VBOをVAOにバインドする方法です。
glBindBuffer(GL_ARRAY_BUFFER, vboID[0]);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLint), 0, GL_STREAM_DRAW);
glVertexAttribPointer(0, 3, GL_INT, false, 0, 0);
これが機能するfloatベクトル入力GLSLです。 in_Position
上in_Position
からマイナスcamera
で、intにキャストしてから、C++コードにフロートします。
#version 150 core
uniform mat4 projviewMatrix;
in vec3 in_Position;
in vec3 in_Color;
out vec3 pass_Color;
void main()
{
gl_Position = projviewMatrix * vec4(in_Position, 1.0);
pass_Color = in_Color;
}
私のprojviewMatrixは、正投影と1/2スケーリングの2つのことしか行いません。平行移動や回転などはありません。そのオルソ部分はこれらのパラメータで生成され、幅/高さはウィンドウの幅/高さです。
proj = orthoProj(-width, width, -height, height, -4, 4);
編集:
アルフの要求で:
これは、ユニフォームをバインドした直後に発生します。
glBindBuffer(GL_ARRAY_BUFFER, vboID[0]);
int* buffer = (int*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
static const int width = 1000;
TestObject& test = game.test;
buffer[0] = test.pos[0] - width;
buffer[1] = test.pos[1] - width;
buffer[2] = 0;
buffer
そして、私は継続的にそのように手動で 記入します。test.pos
は正方形の中心であり、camera.pos
現在xy座標(1 << 31、1 << 31)に等しくなります。C ++で減算を行う場合、バッファー内の各頂点の後に次のような3行があります。
buffer[0] -= camera.pos[0];
buffer[1] -= camera.pos[1];
buffer[2] -= camera.pos[2];
いずれにせよ、私はデータを整数として渡します。上記のブロック(各buffer
頂点で発生)は、カメラの均一なバインディングとGLSLコードの違いに加えて、私の「GLSLでの減算」と「c++での減算」の違いだけです。
test.pos
とcamera.pos
は両方ともEigen::Vector3ui
オブジェクトなので、uintvector3sです。
edit2:
シェーダーにエラーを出力するデバッグ出力があることにも注意する価値があると思いますが、エラーはありません。また、とに変更するとin_Position
、他のものと同じ青緑色の色合いになります。camera
vec3
頂点シェーダーで独自のivec3を作成し、代わりにそれを使用するとcamera
、「カメラ」の値を変更して、現在確認できるものを移動できます。これは、おおよそ0から1<<32の範囲の超膨張した正方形です。 x軸とy軸。私の頂点シェーダーには、型ジャグリングや中間変数の量がこれを修正できないようです。
編集3:
glVertexAttribIPointer()
データを入れるために使用するin_Position
と、問題の一部が修正されました。これは、GLSLコードが実行される前に、OpenGLが追加のキャストを実行してフロートするように見えることは間違いありません。ただし、camera
ベクターはまだ同じようにバグがあり、現在の使用以外にできることは何もわかりませんglUniform3uiv
。3つの値を使用glUniform3ui
して入力してみましたが、それも機能しませんでした。