1回の描画呼び出しで10万以上のキューブ(同じVAOのインデックス付きジオメトリを使用して36個の頂点で作成)をレンダリングしたいのですが可能ですか?1回のドローコールで何千ものプリミティブを描画する
ジオメトリデータ(頂点データ)はすべてキューブなので、すべて同じです。投影とカメラビューも同じで、ユニフォームと同じように頂点シェーダに渡されます。それが重要な場合
#version 330 core
in vec3 position;
in vec4 vColor;
out vec4 fColor;
out vec3 fTexcoord;
// Model
uniform mat4 model;
// View or a.k.a camera matrix
uniform mat4 camera_view;
// Projection
uniform mat4 projection;
void main() {
gl_Position = projection * camera_view * model * vec4(position, 1.0f);
fColor = vColor;
fTexcoord = normalize(position);
}
Render.cpp
for (auto chunk : world->chunks) {
for (auto cube : chunk.blocks) {
glBindTexture(GL_TEXTURE_CUBE_MAP, textures[cube.texture]);
// Model - transform_z * transform_y * transform_x * transform_translation * transform_scaling
model = Mat4<GLfloat>();
model = model.translate(cube.position);
model = model.scale(cube.scale);
model = model * transformation_matrix_x(cube.theta_x);
model = model * transformation_matrix_y(cube.theta_y);
model = model * transformation_matrix_z(cube.theta_z);
glUniformMatrix4fv(gl_model, 1, GL_TRUE, model.data());
// One draw call per cube is not scalable
glDrawElements(GL_TRIANGLES, cube.indices.size(), GL_UNSIGNED_INT, 0);
}
// A draw call like this would be nice since they share so much data.
// glDrawLotsOfElements(GL_TRIANGLES, cube.indices.size() * numCubes, GL_UNSIGNED_INT, 0);
}
頂点シェーダは、キューブの数は、動的です。
https://www.opengl.org/sdk/docs/man/html/glDrawElementsInstanced.xhtmlを参照してください。 インスタンス化されたレンダリングと呼ばれ、ジオメトリの1セットを取り、それを複数回描画します。 –
キューブ間で異なるのはモデル行列だけなので、どのようにして36個の頂点(キューブ)の各セットが1つのモデル行列などでセットアップされるように設定することができますか? – Entalpi
マトリックスが各フレームで変化しているのか、それとも初期化時にマトリックスを設定していますか?初期化だけの場合は、頂点のすべての位置を事前に計算し、頂点シェーダで – wasthishelpful