opengl glGetProgramResourceName()引发的

4urapxun  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在尝试从着色器句柄using glGetProgramResourceName()获取统一块名称。
然而,它会抛出(0xC 0000005:在std::vector<GLchar> blockName上执行位置0x 000000000000000)时发生访问冲突,我无法找出原因。

GLint numUniformBlocks = 0;
GLint  maxLength;
GLsizei size;
glGetProgramiv(handle_, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength);
glGetProgramInterfaceiv(handle_, GL_UNIFORM_BLOCK, GL_ACTIVE_RESOURCES, &numUniformBlocks);
std::array<GLenum, 3> blockProperties{GL_NAME_LENGTH, GL_NUM_ACTIVE_VARIABLES, GL_BUFFER_DATA_SIZE};
std::array<GLint, 3> blockData{};
for (int blockIx = 0; blockIx < numUniformBlocks; ++blockIx) {
    glGetProgramResourceiv(handle_,GL_UNIFORM_BLOCK,blockIx,blockProperties.size(), blockProperties.data(), blockData.size(),nullptr,blockData.data()
    );
    //Retrieve name
    //std::string blockName(blockData[0], ' ');
    //std::vector<char> blockName(blockData[0]);
    std::vector<GLchar> blockName; //Yes, not std::string. There's a reason for that.
    blockName.resize(blockData[0]);
    //GLchar* blockName = static_cast<GLchar*>(malloc(maxLength));
    glGetProgramResourceName(handle_, GL_UNIFORM_BLOCK, blockIx, blockName.size(), &size, blockName.data());
}

这是我的着色器

#version 400
layout (location = 0) in vec4 VertexPosition;
out vec2 TexCoords;
layout(std140) uniform Matrices_XY{
    mat4 cameraToClipMatrix;
    mat4 worldToCameraMatrix;
    mat4 modelToWorldMatrix;
    mat4 NormalMatrix;
};
void main(){
    gl_Position = cameraToClipMatrix * worldToCameraMatrix * modelToWorldMatrix * vec4(VertexPosition.xy, 0.0, 1.0);    
    TexCoords = VertexPosition.zw;
}

我尝试了std::stringstd::vector<char>GLchar* name = static_cast<GLchar*>(malloc(maxLength))和所有throw。我尝试了追加'\0'并调整发送到调用的函数的大小,但所有throw。我希望获得唯一UBO的名称“Matrices_XY”
我使用的是OpenGL 4.6、C++20、MSVC 2022/17.3.6、Windows Pro 10、x64和MFC

yx2lnoni

yx2lnoni1#

我没有定义函数;一旦我加上,一切都好

glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)wglGetProcAddress("glGetProgramResourceName");

相关问题