gpt4 book ai didi

c++ - GLSL : Replace large uniform int array with buffer or texture

转载 作者:可可西里 更新时间:2023-11-01 18:28:18 25 4
gpt4 key购买 nike

现在我正在尝试将一个整数数组传递到片段着色器中,并通过一个统一数组来实现:

uniform int myArray[300];

并在着色器外用 glUniform1iv 填充它。

不幸的是,大于 ~400 的统一数组会失败。我知道我可以改用“统一缓冲区”,但似乎找不到将大型一维数组传递到带有缓冲区或其他方式的片段着色器的完整示例。

谁能提供这样的例子?

最佳答案

这应该让您开始使用统一缓冲区对象来存储数组。注意GL要求UBO的最小容量为16KiB,最大容量可以通过GL_MAX_UNIFORM_BLOCK_SIZE查询。

片段着色器示例(UBO 需要 OpenGL 3.1):

#version 140 // GL 3.1

// Arrays in a UBO must use a constant expression for their size.
const int MY_ARRAY_SIZE = 512;

// The name of the block is used for finding the index location only
layout (std140) uniform myArrayBlock {
int myArray [MY_ARRAY_SIZE]; // This is the important name (in the shader).
};

void main (void) {
gl_FragColor = vec4 ((float)myArray [0] * 0.1, vec3 (1.0));
}

OpenGL代码

const int MY_ARRAY_SIZE = 512;

GLuint myArrayUBO;
glGenBuffers (1, &myArrayUBO);

// Allocate storage for the UBO
glBindBuffer (GL_UNIFORM_BUFFER, myArrayUBO);
glBufferData (GL_UNIFORM_BUFFER, sizeof (GLint) * MY_ARRAY_SIZE,
NULL, GL_DYNAMIC_DRAW);

[...]

// When you want to update the data in your UBO, you do it like you would any
// other buffer object.
glBufferSubData (GL_UNIFORM_BUFFER, ...);

[...]

GLuint myArrayBlockIdx = glGetUniformBlockIndex (GLSLProgramID, "myArrayBlock");

glUniformBlockBinding (GLSLProgramID, myArrayBlockIdx, 0);
glBindBufferBase (GL_UNIFORM_BUFFER, 0, myArrayUBO);

我可能忘记了什么,我不写教程是有原因的。如果您在执行此操作时遇到任何问题,请发表评论。

更新:

请注意 glUniformBlockBinding (...)glBindBufferBase (...) 中使用的 0 是绑定(bind)的全局标识符观点。当与 std140 布局结合使用时,这意味着您可以在任何 GLSL 程序中使用此 UBO,您将其中一个统一 block 绑定(bind)到该绑定(bind)位置 (0) .当您想在许多不同的 GLSL 程序之间共享诸如 ModelView 和投影矩阵之类的东西时,这实际上非常方便。

关于c++ - GLSL : Replace large uniform int array with buffer or texture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com