У меня есть 4-мерные вершины (X, Y, A, B), которые я хотел бы нарисовать как 6 отдельных 2D-графиков (XxY, XxA, XxB, YxA, ...)
Мои вершины определены следующим образом:
GLint data[MAX_N_POINT][4];
Я могу легко нарисовать первый (X, Y) из 2D-графиков с помощью:
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: я обновил код шейдера в соответствии с предложениями Кристиана. Я также убедился, что оттенок загружается без ошибок, однако, если я проверю наличие ошибок OpenGl после вызова glUseProgram, я получаю сообщение об ошибке 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;
}
if
в вашем шейдере? - person user786653   schedule 12.10.2011