繁体   English   中英

OpenGL:零活动制服

[英]OpenGL: Zero active uniforms

我指的是 OpenGL SuperBible。 我使用他们的框架来创建自己的程序。 我想用接口块(特别是统一块)做一些事情。 如果我打电话

glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);

我收到一个错误,即GL_INVALID_VALUE 但是如果我用 0 而不是 1 调用同一个函数,它就不会出错。 我当时假设,我没有现役制服。 不过,我应该有 3 个。 我如何激活它们? 这是我的着色器:

#version 450 core                        
layout (location = 0) in vec4 position;  
layout (location = 1) in vec4 color;     
out vec4 vs_color;                       
uniform TransformBlock {                
    mat4 translation;                    
    mat4 rotation;                        
    mat4 projection_matrix;             
};                                      
void main(void)                          
{                                        
    mat4 mvp = projection_matrix * translation * rotation ;    
    gl_Position = mvp * position;  
vs_color = color;                   
}                                       
             

以下是启动方法中的一些代码:

    static const GLchar* uniformNames[3] = {
        "TransformBlock.translation",
        "TransformBlock.rotation",
        "TransformBlock.projection_matrix",
    };
    GLuint uniformIndices[3];
    glUseProgram(program);

    glGetUniformIndices(program, 3, uniformNames, uniformIndices);

    GLint uniformOffsets[3];
    GLint matrixStrides[3];
    glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
    glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_MATRIX_STRIDE, matrixStrides);

    unsigned char* buffer1 = (unsigned char*)malloc(4096);

//fill buffer1 in a for-loop

    GLuint block_index = glGetUniformBlockIndex(program, "TransformBlock");
    glUniformBlockBinding(program, block_index, 0);
    glBindBufferBase(GL_UNIFORM_BUFFER, 0, (GLuint)buffer1);
    free(buffer1);
                

但是,由于函数返回GL_INVALID_VALUE ,调用出现错误:

*((float *)(buffer1 + offset)) = ...

并且整个程序中断。 如果不添加offset ,我不会在这里收到错误,所以我认为第二个错误取决于第一个错误。

我认为glGetUniformIndices出错了,因为您在统一名称前加上TransformBlock 您也不会使用它来访问 GLSL 代码中带有该前缀的制服。 如果需要,则必须为统一块设置实例名称块名称与访问/命名统一块完全无关。 如果将访问同一接口块的多个着色器链接在一起,则它仅用于匹配接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM