4

固定小数点(または最小のゲーム単位を表す1の整数)を使用して頂点ベクトルを記述する場合、OpenGL /固有変換を設定してそれを使用するにはどうすればよいですか?頂点シェーダーでこれを行っている場合:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0)

in_PositionをGL_INTのvec3として渡し、行列をGL_FLOAT mat4として渡すと、適切なキャストが行われますか?パフォーマンスコストはありますか?

変換行列を固定小数点にすることもできますか?

これは2Dゲームで行われているので、3Dよりも実現可能だと思います。物事が原点から遠く離れると、大きな地図の位置が低下するように見えるので、私は本当に正確さを好みます。頂点がまだfloatとして記述されているのに、オブジェクトの位置だけが整数であると、おそらく逃げることができると思います。ただし、私の衝突スキームは、固定点の頂点でより適切に機能すると思います。一般的にパフォーマンスの違いは何ですか?

4

2 に答える 2

1

これは、パフォーマンスにペナルティを課すintからfloatへの変換を意味します。CPUからGPUへのコピー時にin_Positionをvec3にキャストする必要があります。Matrixオブジェクトを使用してそれらをCPUに格納する場合は、次の方法でキャストできます。

MatrixXf data_as_float = data_as_int.cast<float>();

次に、data_as_floatを使用してglBufferDataを呼び出します。

于 2012-12-09T09:03:26.500 に答える
0

さて、いくつかの実験の後、私は解決策に落ち着きました。

gl_Position = projviewMatrix * vec4(ivec3(in_Position - camera), 1.0);

camerauniform uvec3、、in_Positionuvec3位置入力です。平行移動は個別の操作として実行されますが、ビューのスケーリング、回転、および投影は通常どおりmat4フロート( )を使用して実行されます。projviewMatrix

glVertexAttribIPointer適切なタイプと入力コマンド( )が使用されるように注意する必要があります。OpenGLは、浮動小数点にキャストすることに非常に熱心であるように見えますが、データは整数型のままであるため、小さなエラーが発生すると、入力が破損します。

projviewMatrix乗算用の中間64ビットストレージにアクセスできないため、固定小数点で乗算を実行することは不可能です。で使用されるビットin_PositionprojviewMatrix合計が32になる場合にのみ、使いやすさに近づきますが、レンダリングの座標が原点に非常に近く、余分な演算が得られないことを考慮すると(乗算後にシフトする必要があるため、GPUは浮動小数点数と同じくらい長くかかります) ints)、位置がカメラによって中央に配置された後、固定小数点演算を実行する理由はありません。

もちろん、これは整数位置データを実際に操作することの王室の苦痛を無視しています。私は本当にそれをお勧めしません。

于 2012-12-15T14:48:11.107 に答える