尝试使用C ++将着色器应用于OpenGL中的顶点数组时出现问题

时间:2011-10-12 15:12:31

标签: c++ opengl glsl swizzling

我有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;
}

1 个答案:

答案 0 :(得分:2)

启用/使用程序(axes)后,您必须设置glUniform1i制服(glUseProgram),否则它没有任何效果(和{{1} uniform保持其默认值,似乎为0)。但是我希望你的程序还包含一个使用axes变化的有效片段着色器,因为固定函数片段处理器不知道如何处理这种变化。

顺便说一下,如果所有顶点都采用相同的路径,但不会花费你那么多,但是使用6种不同的着色器在性能方面会更好。您仍然可以使用预处理器宏来减少写入开销。

编辑:从您的更新中看来,您似乎没有使用特殊的片段着色器。因此,您只需将内置片段管道与顶点着色器一起使用。虽然这是可能的,但您仍然必须匹配两个阶段才能一起工作。您的passcolor变化完全没用,因为固定功能管道不知道如何处理它。只需使用buitlin颜色变化并替换

passcolor

passcolor = gl_Color;

你还应该检查你的着色器是否编译成功并链接成功并检查信息日志,以防它们没有,因为我认为由于上述不同的不一致,你的程序不会链接。所以你最终没有使用着色器(以及一堆gl_FrontColor = gl_Color; gl_BackColor = gl_Color; //just to be sure s)而没有注意到它。