如何将const数据发送到着色器?

时间:2016-07-09 12:18:31

标签: opengl glsl shader

我想将const int变量从CPU端发送到着色器,这样我就可以方便地在着色器中初始化数组。

但是,如果使用通常的glUniform1ui(programm, N)着色器编译器发送,则N必须为const。

#version 450 core
uniform const int N;
int myArray[N];

void main() {
//...
}

这可能吗?如果是,那么解决方法是什么?

P.S。 我知道这与统一变量的定义无关,它明确了每个着色器执行时制服是不可变的

1 个答案:

答案 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)而不是数组,并获取纹理的值而不在值之间进行插值。