OpenGL ES 2.0 修改着色器变量
OpenGL ES 2.0 modify shader variable
我以为你可以修改一个 Uniform 变量,然后在绘制后使用这个方法来获取变量,但它在构建着色器时抛出一个无法修改统一的异常。
glGetUniformfv(PROGRAM_INT, UNIFORM_INT, 参数, 0);
我想让着色器修改一个变量,return那个变量?
有没有办法修改着色器变量,并使用 GL 方法获取该变量?
没有。统一变量在着色器代码中是只读的。它们用于将值从您的 Java/C++ 客户端代码传递到着色器代码,而不是相反。
在 ES 2.0 中,我能想到的将着色器生成的值返回到客户端代码中的唯一方法是将它们生成为片段着色器输出中的颜色值。然后它们将成为帧缓冲区内容的一部分,您可以使用 glReadPixels()
.
读回
在较新版本的 OpenGL ES 以及最新版本的完整 OpenGL 中,还有其他选项。例如,ES 3.1 引入了 Shader Storage Buffers,OpenGL 4.3 及更高版本也可以使用。它们允许着色器将值写入缓冲区,您可以从客户端代码中读回这些值。
我以为你可以修改一个 Uniform 变量,然后在绘制后使用这个方法来获取变量,但它在构建着色器时抛出一个无法修改统一的异常。
glGetUniformfv(PROGRAM_INT, UNIFORM_INT, 参数, 0);
我想让着色器修改一个变量,return那个变量?
有没有办法修改着色器变量,并使用 GL 方法获取该变量?
没有。统一变量在着色器代码中是只读的。它们用于将值从您的 Java/C++ 客户端代码传递到着色器代码,而不是相反。
在 ES 2.0 中,我能想到的将着色器生成的值返回到客户端代码中的唯一方法是将它们生成为片段着色器输出中的颜色值。然后它们将成为帧缓冲区内容的一部分,您可以使用 glReadPixels()
.
在较新版本的 OpenGL ES 以及最新版本的完整 OpenGL 中,还有其他选项。例如,ES 3.1 引入了 Shader Storage Buffers,OpenGL 4.3 及更高版本也可以使用。它们允许着色器将值写入缓冲区,您可以从客户端代码中读回这些值。