C++ OpengLプログラムとGLSL Vertex and Fragmentシェーダを使用しています。GLSLを使用してシェーダ内の位置から直接変換マトリックスを計算する
私は同じオブジェクトのいくつかのインスタンスを作成しています。私はインスタンス間のオブジェクトの位置を変更する必要があります。
これは私がやったことです:私は変換行列の配列である統一変数を使って作業しています。各マトリックスはオブジェクトインスタンスを表します。
MVPも変換行列ですが、MVPはカメラの位置、向き、およびプロパティによって設定されます。ここで
は、私の頂点シェーダである:ここで
#version 330 core
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;
uniform mat4 object_positions[20];
out vec3 fragment_color;
uniform mat4 MVP;
void main()
{
gl_Position = object_positions[gl_InstanceID] * MVP * vec4(vertex_position,1.0);
fragment_color = vertex_color;
}
は、私はC++でオブジェクトの位置を設定するためのプログラムを実行するために持っているものです。
glm::mat4 object_positions[20];
object_positions[0] = glm::translate(glm::mat4(1), glm::vec3(0.4f,0.2f,0.0f));
object_positions[1] = glm::translate(glm::mat4(1), glm::vec3(0.5f,1.4f,0.0f));
...
object_positions[19] = glm::translate(glm::mat4(1), glm::vec3(-10.6f,0.2f,0.0f));
GLuint object_positions_id = glGetUniformLocation(program_id, "object_positions");
...
glUniformMatrix4fv(object_positions_id, 7, GL_FALSE, glm::value_ptr(object_positions[0]));
あなたはGLMの2番目の引数として参照vec3 :: translateには各オブジェクトの位置が含まれます。 この時点ですべてのことがうまく動作します。
私がしたいことは、shaderのglm :: translteを計算することです。私が実際に望むのは、それぞれのポジションにマット4の代わりにvec3を送ることです。私はGPUにCPUの代わりに変換行列を計算させたい。私が試したものはすべて動作しません。 OpenGLの変換行列について
おかげ
にノーをしない理由はありません。それは全く同じ結果です。 object_positionsは、この場合は変換行列でなければなりません。 – Bob5421
オフセットを追加するだけの方がはるかに簡単で高速なのはなぜですか? –
はい、これは素晴らしいアイデアですが、私は何をwに入れるべきですか? – Bob5421