4

シェーダーを介してワールド内の描画位置を適用するにはどうすればよいですか?

私の頂点シェーダーは次のようになります。

in vec2 position;

uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 projection;

void main() {
    gl_Position = projection * view * model * vec4(position, 0.0, 1.0);
}

position三角形の頂点の位置はどこですか。

次のように行列をバインドしています。

ビュー:

glm::mat4x4 view = glm::lookAt(
                    glm::vec3(0.0f, 1.2f, 1.2f),    // camera position
                    glm::vec3(0.0f, 0.0f, 0.0f),    // camera target
                    glm::vec3(0.0f, 0.0f, 1.0f));   // camera up axis
GLint view_uniform = glGetUniformLocation(shader, "view");
glUniformMatrix4fv(view_uniform, 1, GL_FALSE, glm::value_ptr(view));

投影:

glm::mat4x4 projection = glm::perspective(80.0f, 640.0f/480.0f, 0.1f, 100.0f);
GLint projection_uniform = glGetUniformLocation(shader, "projection");
glUniformMatrix4fv(projection_uniform, 1, GL_FALSE, glm::value_ptr(projection));

モデル変換:

glm::mat4x4 model;
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, static_cast<float>((glm::sin(currenttime)) * 360.0), glm::vec3(0.0, 0.0, 1.0));
GLint trans_uniform = glGetUniformLocation(shader, "model");
glUniformMatrix4fv(trans_uniform, 1, GL_FALSE, glm::value_ptr(model));

したがって、この方法では、CPU で各フレームの位置変換を計算する必要があります。これは推奨される方法ですか、それともより良い方法がありますか?

4

2 に答える 2

2

render()メソッドでは、通常、次のことを行います

  • カメラのマトリックスを作成します (通常はフレームごとに 1 回)
  • シーン内の各オブジェクトに対して:
    • 変換 (位置) マトリックスを作成する
    • 描画オブジェクト

射影行列は、 ごとに 1 回windowResize、またはカメラの行列を作成するときに作成できます。

回答:あなたのコードは良いです。オブジェクトを描画/更新する基本的な方法です。

それを自動的に管理するフレームワーク/システムに入ることができます。これらの行列作成手順のパフォーマンスについて (今のところ) 気にする必要はありません...非常に高速です。描画はより問題があります。

jozxyqkが 1 つのコメントに書いたように、3 つの異なるマトリックスではなく、1 つの組み合わせたマトリックスを作成して送信できますModelViewProjMatrix

于 2013-08-28T13:26:54.360 に答える
2

したがって、この方法では、CPU で各フレームの位置変換を計算する必要があります。これは推奨される方法ですか、それともより良い方法がありますか?

はい。CPU でメッシュの新しい変換を 1 回計算し、それを頂点シェーダー内のメッシュ内のすべての頂点に適用するのは、それほど時間のかかる操作ではなく、フレームごとに実行する必要があります。

于 2013-08-28T13:21:39.533 に答える