gpt4 book ai didi

c++ - GLSL 子程序没有改变

转载 作者:行者123 更新时间:2023-11-28 06:54:10 24 4
gpt4 key购买 nike

我已经开始学习 GLSL 和 OpenGL。现在我想看看 GLSL 子程序是如何工作的,所以我在这里有我的片段着色器:

#version 330 core

out vec4 color;

subroutine vec4 ColorFunc();

subroutine (ColorFunc) vec4 colorBlue() {
return vec4(0.0, 0.0, 1.0, 1.0);
}

subroutine (ColorFunc) vec4 colorGreen() {
return vec4(0.0, 1.0, 0.0, 1.0);
}

subroutine uniform ColorFunc ColorSelector;

void main() {
color = ColorSelector();
}

在我加载的应用程序源代码中,编译链接着色器并在开头启动程序。创建了一个三角形,顶点着色器没有做任何特别的事情。 display 函数(发送到 glutDisplayFunc 的函数)如下所示:

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glBindVertexArray(TriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);

GLint ColorSelectorLoc;
GLuint colorBlueIndex;
GLuint colorGreenIndex;

ColorSelectorLoc = glGetSubroutineUniformLocation(program, GL_FRAGMENT_SHADER, "ColorSelector");
if (ColorSelectorLoc < 0)
{
fprintf(stderr, "Error: ColorSelector is not an active subroutine uniform in the shader\n");
exit(EXIT_FAILURE);
}

colorBlueIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorBlue");
colorGreenIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorGreen");

GLsizei n;
glGetProgramStageiv(program, GL_FRAGMENT_SHADER, GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &n);
GLuint *indices = new GLuint[n];
cout << "colorGreen: " << colorBlueIndex;
indices[ColorSelectorLoc] = colorGreenIndex;
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, n, indices);
delete [] indices;

glFlush();
}

我期望的是三角形是绿色的,但它们始终是蓝色的,无论 ColorSelector 的值如何,它已被正确检索(其值为 0)。 colorBlueIndex 是 0,colorGreenIndex 是 1。我不知道我错过了什么。

最佳答案

glUniformSubroutinesuiv 调用期望 n 等于事件子例程位置的数量

你可以用:

glGetProgramStage(program, GL_FRAGMENT_SHADER, GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &n);

参见 the wiki

关于c++ - GLSL 子程序没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391311/

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