Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在使用C++;_C++_Opengl_Glsl_Swizzling - Fatal编程技术网

C++ 在使用C++;

C++ 在使用C++;,c++,opengl,glsl,swizzling,C++,Opengl,Glsl,Swizzling,我有4个维度的顶点(X,Y,A,B),我想画成6个独立的2D图(XxY,XxA,XxB,YxA,…) 我的顶点定义如下: GLint data[MAX_N_POINT][4]; 我可以使用以下工具绘制二维绘图的第一个(X,Y): glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(4, GL_INT, 4*sizeof(GLint), &data[0][0]); glDrawArrays(GL_POINTS, 0, MAX_N_

我有4个维度的顶点(X,Y,A,B),我想画成6个独立的2D图(XxY,XxA,XxB,YxA,…)

我的顶点定义如下:

GLint data[MAX_N_POINT][4];
我可以使用以下工具绘制二维绘图的第一个(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:我已经根据Christian的建议更新了着色器代码。我还验证了阴影加载没有错误,但是如果我在调用GluseProgramm后检查OpenGl错误,我会得到一个
OpenGl错误:无效操作
错误

编辑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;
}

启用/使用程序(
glUseProgram
)后,您必须设置
统一(
glUniform1i
),否则它不会产生任何效果(并且
统一保持其默认值,该值似乎为0)。但是我希望你的程序也包含一个有效的片段着色器,它使用你的
passcolor
变量,因为固定函数片段处理器不知道如何处理这个变量

顺便说一句,虽然如果所有顶点都采用相同的路径,成本不会太高,但是使用6个不同的着色器在性能方面会更好。您仍然可以使用预处理器宏来减少写入开销

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

passcolor = gl_Color;


您还应该检查着色器是否编译和链接成功,并检查信息日志,以防它们不成功,因为我认为您的程序不会链接,因为上面的各种不一致性。因此,您最终没有使用着色器(以及一系列
GL\u无效\u操作
s),而没有注意到它。

我不知道为什么您的着色器不工作,但为什么不使用不同的模型视图矩阵,而不是在着色器中执行大的
if
?我想知道我的着色器是否没有正确加载。虽然在我运行程序时不会抛出任何错误。@user786653说得好。但是我看不出哪里可以使用简单的矩阵向量乘法从任何地方创建1的w分量,因为他的向量的所有四个分量都用于数据。@ChristianRau:嗯,是的,似乎还需要一些顶点着色器支持。很好。通常我会建议OP总是检查返回值/
glGetError
,但是OGL真的很麻烦。。类似的东西很方便。好吧,我将GluseProgramm移到定义
轴的行上方,但可惜没有效果。@slayton查看我的更新。看来你还是默默地不使用着色器了。@ChristianRau谢谢,我更新了着色器,并在绘图中加入了错误检查。我得到一个
OpenGL错误:无效操作
errorOk,我让它工作了,我稍微修改了着色器代码。谢谢你的帮助。如果没有passcolor,我是不会让它工作的。
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;       //just to be sure