こんにちは、glDrawArraysInstanced() を使用して、多くの軸に沿った立方体をレンダリングしようとしています。固定サイズの各立方体は、その中心位置と色のみを変えることができます。また、各キューブはいくつかの異なる色しか取りません。したがって、次のインスタンス データごとに数百万のキューブを潜在的にレンダリングしたいと考えています。
struct CubeInfo {
Eigen::Vector3f center; // center of the cube (x,y,z)
int labelId; // label of the cube which affects its color
};
したがって、次の頂点シェーダーを使用しています。
#version 330
uniform mat4 mvp_matrix;
//regular vertex attributes
layout(location = 0) in vec3 vertex_position;
// Per Instance variables
layout(location = 1) in vec3 cube_center;
layout(location = 2) in int cube_label;
// color out to frag shader
out vec4 color_out;
void main(void) {
// Add offset cube_center
vec4 new_pos = vec4(vertex_position + cube_center, 1);
// Calculate vertex position in screen space
gl_Position = mvp_matrix * new_pos;
// Set color_out based on label
switch (cube_label) {
case 1:
color_out = vec4(0.5, 0.25, 0.5, 1);
break;
case 2:
color_out = vec4(0.75, 0.0, 0.0, 1);
break;
case 3:
color_out = vec4(0.0, 0.0, 0.5, 1);
break;
case 4:
color_out = vec4(0.75, 1.0, 0.0, 1);
break;
default:
color_out = vec4(0.5, 0.5, 0.5, 1); // Grey
break;
}
}
および対応するフラグメント シェーダー:
#version 330
in vec4 color_out;
out vec4 fragColor;
void main()
{
// Set fragment color from texture
fragColor = color_out;
}
ただし、cube_label の値が 1 から 4 の間であっても、color_out は常にデフォルトの灰色の値を取ります。これは私の問題です。上記のシェーダーで何か間違ったことをしていますか?**
1 ~ 4 のランダムな labelId を使用して、cubeInfo vbo を初期化しました。したがって、次よりもカラフルな出力が表示されることを期待しています。
これは、Qt のQGLShaderProgramとQGLBufferラッパーを利用する私のレンダリング コードです。
// Enable back face culling
glEnable(GL_CULL_FACE);
cubeShaderProgram_.bind();
// Set the vertexbuffer stuff (Simply 36 vertices for cube)
cubeVertexBuffer_.bind();
cubeShaderProgram_.setAttributeBuffer("vertex_position", GL_FLOAT, 0, 3, 0);
cubeShaderProgram_.enableAttributeArray("vertex_position");
cubeVertexBuffer_.release();
// Set the per instance buffer stuff
cubeInstanceBuffer_.bind();
cubeShaderProgram_.setAttributeBuffer("cube_center", GL_FLOAT, offsetof(CubeInfo,center), 3, sizeof(CubeInfo));
cubeShaderProgram_.enableAttributeArray("cube_center");
int center_location = cubeShaderProgram_.attributeLocation("cube_center");
glVertexAttribDivisor(center_location, 1);
cubeShaderProgram_.setAttributeBuffer("cube_label", GL_INT, offsetof(CubeInfo,labelId), 1, sizeof(CubeInfo));
cubeShaderProgram_.enableAttributeArray("cube_label");
int label_location = cubeShaderProgram_.attributeLocation("cube_label");
glVertexAttribDivisor(label_location, 1);
cubeInstanceBuffer_.release();
// Do Instanced Renering
glDrawArraysInstanced(GL_TRIANGLES, 0, 36, displayed_num_cubes_ );
cubeShaderProgram_.disableAttributeArray("vertex_position");
cubeShaderProgram_.disableAttributeArray("cube_center");
cubeShaderProgram_.disableAttributeArray("cube_label");
cubeShaderProgram_.release();
上記の主な質問 (色の問題) は別として、これは Minecraft を行う良い方法ですか?
更新CubeInfo.labelId
属性を からint
に
変更し、対応する頂点float
シェーダー変数cube_label
もfloat
に変更すると、動作します!!。なぜそうなのですか?このページでは、GLSL サポーターは int 型と書かれています。私にとっては、labelId/cube_label を int/short にすることをお勧めします。
更新 2:
レンダリング コードの次の行で GL_INT の代わりに GL_FLOAT に変更しただけでも、適切な色が得られます。
cubeShaderProgram_.setAttributeBuffer("cube_label", GL_INT, offsetof(CubeInfo,labelId), 1, sizeof(CubeInfo));