C++ 数据未正确发送到缓冲区?

C++ 数据未正确发送到缓冲区?,c++,opengl,glsl,C++,Opengl,Glsl,我正在尝试制作一个系统,在这个系统中,我使用属性将数据从缓冲区传递到顶点着色器,我已经有了一些,但是这个新系统不起作用。我试图将一个奇异整数传递给我的顶点着色器。事实上,我知道我所有的其他系统都在工作,进入缓冲区的数据是正确的。当我放置int而不是属性时,矩阵工作正常,所以我知道这与缓冲区有关 我已经测试了我所有的系统。实际上,当我在顶点着色器中将integer属性插入到数组的操作符中时,它将不起作用,即使它不直接在其中,并且我将另一个int设置为整数。我最终得到了一个全白色的屏幕,由于某种原因

我正在尝试制作一个系统,在这个系统中,我使用属性将数据从缓冲区传递到顶点着色器,我已经有了一些,但是这个新系统不起作用。我试图将一个奇异整数传递给我的顶点着色器。事实上,我知道我所有的其他系统都在工作,进入缓冲区的数据是正确的。当我放置int而不是属性时,矩阵工作正常,所以我知道这与缓冲区有关

我已经测试了我所有的系统。实际上,当我在顶点着色器中将integer属性插入到数组的操作符中时,它将不起作用,即使它不直接在其中,并且我将另一个int设置为整数。我最终得到了一个全白色的屏幕,由于某种原因,当我将属性3改为4时,屏幕变为红色。如果我把它设为1,它仍然会变成白色。进入glbufferdata的数据值是1,我确保它的长度正确,并且每个顶点都有一对

        if (reload == 1)
        {
            char scenepath[32] = "Gamedata\\Scenes\\Scene01.map";

            LoadScene(scenepath);

            for (size_t i = 0; i < ObjNames.size(); i++)
            {
                loadobj(modelloc[i]);
            }

            reorder_index();

            //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer);
            //glBufferData(GL_ELEMENT_ARRAY_BUFFER, index.size() * sizeof(int), &index[0], GL_STATIC_DRAW);




            glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
            glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);


            glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
            glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);

            glBindBuffer(GL_ARRAY_BUFFER, objbuffer);
            glBufferData(GL_ARRAY_BUFFER, model_index.size() * sizeof(int), &model_index[0], GL_STATIC_DRAW); 



            glEnableVertexAttribArray(0);

            glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

            glEnableVertexAttribArray(2);

            glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
            glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

            glEnableVertexAttribArray(3);

            glBindBuffer(GL_ARRAY_BUFFER, objbuffer);  //not workinngggg
            glVertexAttribPointer(3, 1, GL_INT, GL_FALSE, 0, (void*)0);


        }
我希望属性3中的整数进入outmatrix[integer_here],从而在我的游戏中产生多个矩阵所需的结果


我期待您的支持,因为我真的很无知,屏幕的颜色也会因位置的不同而有所不同

如果要定义通用积分顶点属性数据数组,则必须使用(重点是
I
)而不是
glvertexattributepointer

glBindBuffer(GL_数组_BUFFER,objbuffer);
glVertexAttribIPointer(3,1,GL_INT,0,(void*)0);
注意,
glvertexattributepointer
与整型数据类型(例如
GL_INT
)组合使用时,会将整型属性转换为浮点值


统一变量数组由属性索引是无效的

统一或着色器存储块数组只能使用动态统一积分表达式进行索引,否则结果将无法定义

(在最新的GLSL版本4.60中,保持不变)

注意,统一变量存储在默认的统一块中,并且属性不是“动态统一”的,因为它对于顶点着色器的每次运行可能不同

这意味着,根据规范,代码的结果是未定义的


一种解决方法是使用内部格式将矩阵编码为二维(4*N)纹理:

const int N=。。。;
std::向量输出矩阵(N);
胶合tbo;
glGenTextures(1,tbo);
glBindTexture(GL_TEXTURE_2D,tbo);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA32F,4,N,0,GL_RGBA,GL_浮点,outmatrix.data());
使用以下命令从纹理中获取矩阵值:

#版本430
int对象中的布局(位置=3);
布局(绑定=0)均匀采样2D输出矩阵;
// [...]
void main()
{
mat4 outMat=mat4(
texelFetch(输出矩阵,ivec2(0,对象),0),
texelFetch(输出矩阵,ivec2(1,对象),0),
texelFetch(输出矩阵,ivec2(2,对象),0),
texelFetch(输出矩阵,ivec2(3,对象),0)
);
// [...]
}

似乎应该可以工作,因为我注意到直接在着色器中添加浮点而不是int会产生相同的空白屏幕,但是我仍然得到相同的结果:/i我仔细检查了一遍,我100%确定输入了积分。似乎我的缓冲区绑定和内容不匹配,错误的数据正在输入attrib 4,但我真的不知道如何修复它。我将其替换为
glVertexAttribIPointer(3,1,GL_INT,0,(void*)0)但是它不能解决问题:/但是可能是它的一部分。是的,我知道。这就是为什么我要确定,每个顶点都有自己的积分。我认为着色器崩溃了。是的,有两个outMatrix。我通过直接添加0或1来测试它们。(与model_索引中的数据相同)。@Augustsinyukov您试图做的是无效的。看看答案。这似乎有点像som。你想达到什么目标?
#version 430
layout(location = 0) in vec3 v_pos;
//layout (location = 1) in vec3 uv;
layout (location = 2) in vec3 v_Normal;
layout (location = 3) in int object;
out vec3 FragPos;  
out vec3 Normalout;
uniform mat4 outmatrix[];
uniform mat4 model;
void main() {

gl_Position = outmatrix[object] * vec4(v_pos, 10.0f);
FragPos = vec3(model * vec4(v_pos , 0.0));

Normalout =  v_Normal;

}
#version 430

// [...]
layout (location = 3) in int object;
uniform mat4 outmatrix[];

void main()
{
    // [...]
    gl_Position = outmatrix[object] * vec4(v_pos, 10.0f);
}