着色器存储缓冲区的所有值在几何着色器中均为 0
All values of the Shader Storage Buffer are 0 in Geometry Shader
在我的应用程序中,着色器存储缓冲区的所有值似乎都0
在几何着色器中。
这是我测试值的简单几何着色器:
#version 430
#extension GL_ARB_shader_storage_buffer_object : enable
layout (points) in;
layout(invocations = 20) in;
layout (points, max_vertices = 256) out;
uniform mat4x4 matModel;
uniform mat4x4 matView;
uniform mat4x4 matProjection;
uniform mat4x4 matLightView;
struct Info {
vec4 position;
vec4 normal;
vec4 color;
};
layout(std430, binding=0) buffer pointData
{
Info pointElements[];
};
void main() {
if( pointElements[0].position.x == 0 ) {
gl_Position = matProjection * matView * matModel * gl_in[0].gl_Position;
EmitVertex();
}
EndPrimitive();
}
仅渲染点pointElements[0].position.x == 0
(pointElements[0].position.x > 0
不渲染任何内容)。缓冲区的设置是这样完成的:
struct PointData {
float px, py, pz, pw;
float nx, ny, nz, nw;
float r, g, b, a;
}
void setupSSBO() {
std::vector<PointData> data;
int count = 15;
for (int x = 0; x< count; x++) {
for (int y = 0; y< count; y++) {
PointData pt;
pt.px = 1;
pt.py = 2;
pt.pz = 3;
pt.pw = 4;
pt.nx = 5;
pt.ny = 6;
pt.nz = 7;
pt.nw = 8;
pt.r = 9;
pt.g = 10;
pt.b = 11;
pt.a = 12;
data.push_back(pt);
}
}
GLuint ssbo = 0;
std::cout << "errors bnefore: " << glGetError() << std::endl;
glGenBuffers(1, &m_pointData);
std::cout << "glGenBuffers: " << m_pointData << " " << glGetError() << std::endl;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_pointData);
std::cout << "glBindBuffer: " << glGetError() << std::endl;
glBufferData(GL_SHADER_STORAGE_BUFFER, data.size()*sizeof(PointData), NULL, GL_STATIC_DRAW/*GL_DYNAMIC_COPY*/);
std::cout << "glBufferData: " << glGetError() << std::endl;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
std::cout << "glBindBuffer: " << glGetError() << std::endl;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_pointData);
PointData* p = (PointData*)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, data.size() *sizeof(PointData), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
std::cout << "glMapBufferRange: " << glGetError() << std::endl;
memcpy(p, &data[0], data.size()*sizeof(PointData));
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
std::cout << "glUnmapBuffer: " << glGetError() << std::endl;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
std::cout << "glBindBuffer: " << glGetError() << std::endl;
}
与着色器的绑定是这样完成的:
GLuint block_index = glGetProgramResourceIndex(progamId, GL_SHADER_STORAGE_BLOCK, "pointData");
glShaderStorageBlockBinding(progamId, block_index, m_pointData);
glGetError()
调用不会返回错误。并且执行着色器是因为我在测试pointElements[0].position.x == 0
时看到点。值保持0
的原因可能是什么?(问题也在于x
、y
和w
以及normal
和color
)
问题似乎是
glShaderStorageBlockBinding(progamId, block_index, m_pointData);
当我将其替换为时,一切正常:
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, block_index, m_pointData);
编辑
根据我的观察和再次阅读规格后,glGetProgramResourceIndex
和glBindBufferBase
的组合也是不正确的。将glBindBufferBase
与用layout(std430, binding=0)
定义的绑定一起使用是正确的,但glGetProgramResourceIndex
不会返回该绑定,而是返回资源索引。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 函数何时会在c++中包含stack_Unwind_Resume调用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 将浮点数组存储在纹理中,并使用纹理坐标从着色器访问浮点
- 一个粒子太多:GL_INVALID_VALUE生成错误。<start> 不满足着色器存储缓冲区的最低对齐要求
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 着色器存储缓冲区中的 OpenGL 顶点
- 着色器存储缓冲区的所有值在几何着色器中均为 0
- OpenGL:着色器存储缓冲区映射/绑定
- "transfered"数组缓冲区的不同大小的着色器存储缓冲区内容
- 延迟着色,存储位置或从深度构建
- 着色器存储块vs统一块
- 在顶点着色器中修改着色器存储缓冲对象
- 着色器存储缓冲区发送的数据错误
- 为什么着色器和程序在OpenGL中存储为整数