4 つの次元頂点 (X、Y、A、B) を 6 つの個別の 2D プロット (XxY、XxA、XxB、YxA、...) として描画したい
私の頂点は次のように定義されています。
GLint data[MAX_N_POINT][4];
2D プロットの最初の (X,Y) をうまく描画できます:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_INT, 4*sizeof(GLint), &data[0][0]);
glDrawArrays(GL_POINTS, 0, MAX_N_POINT-1);
glDisableclientState(GL_VERTEX_ARRAY);
他の 2D プロット (XxA、AxB など...) を描画するために、描画する次元に応じて頂点の X、Y、Z、W 次元を入れ替えるシェーダーを使用することにしました。
uniform int axes;
void main()
{
vec2 point;
if (axes == 0) {
point = gl_Vertex.xy;
} else if (axes == 1) {
point = gl_Vertex.xz;
} else if (axes == 2) {
point = gl_Vertex.xw;
} else if (axes == 3) {
point = gl_Vertex.yz;
} else if (axes == 4) {
point = gl_Vertex.yw;
} else if (axes == 5) {
point = gl_Vertex.zw;
}
gl_Position = gl_ModelViewProjectionMatrix * vec4(point.xy, 0.0, 1.0);
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
}
プログラムへのシェーダーのロード、コンパイル、追加、およびプログラムのリンクに成功しました。
シェーダー プログラムができたので、頂点配列の描画方法に影響を与えるようなプログラムの使用方法が明確ではありません。次のことを試しましたが、シェーダーがない場合とまったく同じように描画されるため、効果がないようです。
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_INT, 4*sizeof(GLint), &data1[0][0]);
//New shader code here
glUseProgram(shaderProg);
int plotAxes = rand()%4;
GLint axes = glGetUniformLocation(shaderProg, "axes");
glUniform1i(axes, plotAxes);
glDrawArrays(GL_POINTS, 0, MAX_N_POINT-1);
glDisableClientState(GL_VERTEX_ARRAY);
glUseProgram(0);
私が見逃している、または正しく理解していない基本的なものはありますか?
編集 2 : クリスチャンの提案に従って、シェーダー コードを更新しました。また、シェードがエラーなしで読み込まれることも確認しましたが、glUseProgram を呼び出した後に OpenGl エラーをチェックすると、エラーが発生しOpenGL Error: invalid operation
ます。
編集 3 : 動作した最終的なシェーダーは次のとおりです。
uniform int axes;
void main()
{
vec4 point;
if (axes == 0) {
point = gl_Vertex;
} else if (axes == 1) {
point = gl_Vertex.xzyw;
} else if (axes == 2) {
point = gl_Vertex.xwzy;
} else if (axes == 3) {
point = gl_Vertex.yzxw;
} else if (axes == 4) {
point = gl_Vertex.ywxz;
} else if (axes == 5) {
point = gl_Vertex.zwxy;
}
point.z = 0.0;
point.w = 1.0;
// eliminate w point
gl_Position = gl_ModelViewProjectionMatrix * point;
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
}