我在 C++ 和 GLSL 410 中使用 OpenGL 4.5。
我最近遇到了一个问题,我试图设置着色器程序的统一变量,而没有首先使用带有glUseProgram. 我有一个片段着色器,带有一个名为input_color(一个 vec4,我会将输出颜色设置为)的统一变量附加到我的shader_program. 请注意,在绘制任何应该使用它的东西之前,我会调用glUseProgram(shader_program)我的主绘制循环。
// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
用这个程序绘制的三角形全黑,不是我期望的结果。经过一些实验,我意识到我需要在设置制服之前使用该程序。
// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
绘图会产生正确颜色的三角形。
我的问题是为什么我需要先开始使用该程序?我知道 OpenGL 作为状态机工作,但在这种情况下,为什么需要当前的着色器程序状态?毕竟,我显式地将shader_program索引作为参数传递给glGetUniformLocation以获取input_color的内存索引。
我希望这个答案能帮助我更好地理解 OpenGL 中的状态,以及如何利用或管理表示 GPU 上着色器程序的内存块。
许多函数式语言都内置了过滤列表中元素的方法.除非我遗漏了某些东西,否则Q似乎没有任何这样的内置方法.这让我感到惊讶,因为过滤器是许多功能语言中的主要高阶函数.
假设我想过滤掉列表中的所有0 1 0 2 3 0 4.过滤后的结果列表应该是1 2 3 4.我目前在Q中完成此操作:
raze{eval(?;(not;(=;x;0));x;())}peach 1 0 2 3 0 4
Run Code Online (Sandbox Code Playgroud)
这给了我需要的结果,但是当确定所发生的一切都是过滤器时,读取有点不方便.
我可以创建自己的过滤器功能,但我想知道是否只有我缺少的东西.是否有一种传统的方法来过滤Q语言中的内置?