地形をレンダリングし、高さに応じて色を適用したいと考えています。
Qt プロジェクトを書いているので、QGlShaderProgram を使用します。
私の地形グリッドは (0,0,0) から (1000,0,1000) で、頂点は長さ 100 単位ごとに配置されます。均一な配列を使用してデータをシェーダーに転送したかったのです。
シェーダーにデータを送信する際にまだ問題があります。
C++/Qt からの呼び出し:
QGLShaderProgram mShader;
QVector< GLfloat> mHeightMap (10*10, some_data);
GLfloat mXStepSize = 100;
GLfloat mZStepSize = 100;
// ..
mShader.link();
mShader.bind();
mShader.setUniformValueArray( "heights",
&(mHeightMap[0]), // one line after another
mHeightMap.size(), 1 );
mShader.setUniformValue( "x_res", (GLint) mXStepSize);
mShader.setUniformValue( "z_res", (GLint) mZStepSize);
シェーダー ソース:
uniform sampler2D heights;
uniform int x_res;
uniform int z_res;
void main(void)
{
vec4 tmp = gl_Vertex;
vec4 h;
float x_coord = gl_Vertex[0] * 0.001;
float z_coord = gl_Vertex[2] * 0.001;
// interprete as 2D:
int element = int( (x_coord + float(x_res)*z_coord) );
h = texture2D( heights, vec2(x_coord, z_coord));
gl_FrontColor = gl_Color;
gl_FrontColor[1] = h[ element]; // set color by height
tmp.y = h[ element]; // write height to grid
gl_Position = gl_ModelViewProjectionMatrix * tmp;
}
私の間違いはどこですか?
データをシェーダーにロードして、そこにアクセスするにはどうすればよいですか?