2

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_Positioncameraて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_Positionin_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.poscamera.posは両方ともEigen::Vector3uiオブジェクトなので、uintvector3sです。

edit2:

シェーダーにエラーを出力するデバッグ出力があることにも注意する価値があると思いますが、エラーはありません。また、とに変更するとin_Position、他のものと同じ青緑色の色合いになります。cameravec3

頂点シェーダーで独自のivec3を作成し、代わりにそれを使用するとcamera、「カメラ」の値を変更して、現在確認できるものを移動できます。これは、おおよそ0から1<<32の範囲の超膨張した正方形です。 x軸とy軸。私の頂点シェーダーには、型ジャグリングや中間変数の量がこれを修正できないようです。

編集3:

glVertexAttribIPointer()データを入れるために使用するin_Positionと、問題の一部が修正されました。これは、GLSLコードが実行される前に、OpenGLが追加のキャストを実行してフロートするように見えることは間違いありません。ただし、cameraベクターはまだ同じようにバグがあり、現在の使用以外にできることは何もわかりませんglUniform3uiv。3つの値を使用glUniform3uiして入力してみましたが、それも機能しませんでした。

4

1 に答える 1

1

2つの問題がありました。

  1. openGL が float との間で追加のキャストを実行するためglVertexAttribIPointer()、整数属性へのポインターを設定する必要があります。glVertexAttribPointer()
  2. ivec3glUniform3uiv()予期せぬキャストを引き起こす可能性のあるユニフォームが設​​定されました。適切な解決策は、unsinged uniform を使用し、シェーダー内でキャストを実行することです。
于 2012-12-10T22:35:33.897 に答える