我想将const int
变量从CPU端发送到着色器,这样我就可以方便地在着色器中初始化数组。
但是,如果使用通常的glUniform1ui(programm, N)
着色器编译器发送,则N
必须为const。
#version 450 core
uniform const int N;
int myArray[N];
void main() {
//...
}
这可能吗?如果是,那么解决方法是什么?
P.S。 我知道这与统一变量的定义无关,它明确了每个着色器执行时制服是不可变的
答案 0 :(得分:1)
常量是名称常量,不能通过glUniform
方法之一从外部更改,并且不是统一的。
如果要更改常量值,则需要重新编译孔着色器并更改着色器文本。
GLchar** shaderSources = new GLChar*[3];
shaderSources[0] = "#version 450 core\n";
shaderSources[1] = "#define ARRAY_LENGTH 5\n";
shaderSources[2] = myShaderCode;
glShaderSource(shader, 2, shaderSources, LENGTH_OF_EACH(shaderSources, 2));
着色器:
int myArray[ARRAY_LENGTH];
void main()
{
for (int i = 0; i < ARRAY_LENGTH; i++) myArray[i] ....;
}
另一种方法是使用纹理(或SSBO)而不是数组,并获取纹理的值而不在值之间进行插值。