opengl - 如何将常量数据发送到着色器?

标签 opengl glsl shader

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

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

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

void main() {
//...
}

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

p.s. 我知道这与统一变量的定义无关,统一变量的定义阐明了每个着色器执行的统一是不可变的

最佳答案

常量顾名思义就是常量,不能通过 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)而不是数组,并获取纹理的值而不在值之间进行插值。

关于opengl - 如何将常量数据发送到着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281731/

相关文章:

c - Opengl-如何使用事件键盘围绕轴自身旋转四面体?

c++ - 用鼠标点击移动对象

opengl - View 矩阵应该按什么顺序计算?

c++ - Matrix4转GLSL统一值

c# - 无法在屏幕保护程序的 DLL 'opengl32.dll' 中找到入口点

glsl - GLSL 向 C 引入了哪些关键字?

iphone - iPhone 使用什么版本的 GLSL?

opengl - 如何将自定义 C++ 矩阵类传递给 glUniformMatrix

wpf - 当前在 WPF 中编译像素着色器的最佳实践?

opengl - 如何获得准确的片段屏幕位置,如顶点着色器中的 gl_FragCoord?