C++ 在使用C++;
我有4个维度的顶点(X,Y,A,B),我想画成6个独立的2D图(XxY,XxA,XxB,YxA,…) 我的顶点定义如下: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_
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