gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:32:22 27 4
gpt4 key购买 nike

我有 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 的建议更新了着色器代码。我还验证了阴影加载没有错误,但是如果我在调用 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;
}

最佳答案

在启用/使用程序 (glUseProgram) 之后,您必须设置 axes uniform (glUniform1i),否则它不会有任何影响(并且您的 axes 制服保持其默认值,似乎为 0)。但我希望您的程序还包含一个使用您的 passcolor varying 的有效片段着色器,因为固定功能片段处理器不知道如何处理这个 varying。

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

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

passcolor = gl_Color;

gl_FrontColor = gl_Color;
gl_BackColor = gl_Color; //just to be sure

您还应该检查您的着色器是否成功编译和链接,并检查信息日志以防它们不成功,因为我认为您的程序不会由于上述各种不一致而链接。因此,您最终没有注意到它而没有使用着色器(以及一堆 GL_INVALID_OPERATION)。

关于c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com