Opengl 使用着色器存储对象的图形不工作

Opengl 使用着色器存储对象的图形不工作,opengl,drawing,shader,compute-shader,Opengl,Drawing,Shader,Compute Shader,对于所有要渲染的对象,我都使用gldrawerelements。然而,我对计算着色器的冒险给我留下了一个使用glDrawArrays的设置。和许多正在突破这个话题的人一样,我以此为基础。问题是,渲染时,什么都不会出现 #include "LogoTail.h" LogoTail::LogoTail(int tag1) { tag = tag1; needLoad = false; shader = LoadShaders("vertex-shader[LogoTail]

对于所有要渲染的对象,我都使用gldrawerelements。然而,我对计算着色器的冒险给我留下了一个使用glDrawArrays的设置。和许多正在突破这个话题的人一样,我以此为基础。问题是,渲染时,什么都不会出现

#include "LogoTail.h"

LogoTail::LogoTail(int tag1) {
    tag = tag1;
    needLoad = false;
    shader = LoadShaders("vertex-shader[LogoTail].txt","fragment-shader[LogoTail].txt");
    shaderCompute = LoadShaders("compute-shader[LogoTail].txt");

    for( int i = 0; i < NUM_PARTICLES; i++ )
    {
        points[ i ].x = 0.0f;
        points[ i ].y = 0.0f;
        points[ i ].z = 0.0f;
        points[ i ].w = 1.0f;
    }

    glGenBuffers( 1, &posSSbo);
    glBindBuffer( GL_SHADER_STORAGE_BUFFER, posSSbo );
    glBufferData( GL_SHADER_STORAGE_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

    for( int i = 0; i < NUM_PARTICLES; i++ )
    {
        times[ i ].x = 0.0f;
    }

    glGenBuffers( 1, &birthSSbo);
    glBindBuffer( GL_SHADER_STORAGE_BUFFER, birthSSbo );
    glBufferData( GL_SHADER_STORAGE_BUFFER, sizeof(times), times, GL_STATIC_DRAW );
    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

    for( int i = 0; i < NUM_PARTICLES; i++ )
    {
        vels[ i ].vx = 0.0f;
        vels[ i ].vy = 0.0f;
        vels[ i ].vz = 0.0f;
        vels[ i ].vw = 0.0f;
    }

    glGenBuffers( 1, &velSSbo );
    glBindBuffer( GL_SHADER_STORAGE_BUFFER, velSSbo );
    glBufferData( GL_SHADER_STORAGE_BUFFER, sizeof(vels), vels, GL_STATIC_DRAW );
    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
}

void LogoTail::Update(const double dt, float sunTime,glm::vec3 sunN) {
    position=glm::translate(glm::mat4(), glm::vec3(4.5f,0,0));
}

void LogoTail::Draw(shading::Camera& camera){
    shaderCompute->use();
    glBindBufferBase( GL_SHADER_STORAGE_BUFFER, 4, posSSbo );
    glBindBufferBase( GL_SHADER_STORAGE_BUFFER, 5, velSSbo );
    glBindBufferBase( GL_SHADER_STORAGE_BUFFER, 6, birthSSbo );

    glDispatchCompute( NUM_PARTICLES / WORK_GROUP_SIZE, 1, 1 );
    glMemoryBarrier( GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT );

    shaderCompute->stopUsing();
    shader->use();

    shader->setUniform("camera", camera.matrix());
    shader->setUniform("model",position);   

    glBindBuffer( GL_ARRAY_BUFFER, posSSbo );
    glVertexPointer( 4, GL_FLOAT, 0, (void *)0 );
    glEnableClientState( GL_VERTEX_ARRAY );
    glDrawArrays( GL_POINTS, 0, NUM_PARTICLES );
    glDisableClientState( GL_VERTEX_ARRAY );
    glBindBuffer( GL_ARRAY_BUFFER, 0 );
    shader->stopUsing();
}
为了测试,我降低了重力。 我相信没有什么是超出范围的,也没有必要的约束,但它暗示了我为什么粒子没有被吸引。
此外,我还添加了一个几何体着色器,它围绕每个点构造一个四边形,但它没有解决任何问题。

最后5行在我看来似乎有问题:

glBindBuffer( GL_ARRAY_BUFFER, posSSbo );
glVertexPointer( 4, GL_FLOAT, 0, (void *)0 );
glEnableClientState( GL_VERTEX_ARRAY );
glDrawArrays( GL_POINTS, 0, NUM_PARTICLES );
glDisableClientState( GL_VERTEX_ARRAY );
glBindBuffer( GL_ARRAY_BUFFER, 0 );

我猜您是在尝试使用可编程管道中的老方法。我不确定OpenGL规范中如何说明这一点,但在较新版本(GL4.2)中,您似乎被迫将顶点缓冲区绑定到VAO(可能是供应商特定的规则?)。有一次,我需要实现OIT,并尝试使用与您相同的元素绘制缓冲区。我使用的是GL4.2和NVidia卡。没有显示任何内容。然后,我将它们绑定到VAO,问题就消失了。因此,我建议您尝试一下。

添加VAO成功了!由于OpenGL4.3附带了计算着色器,我假设编写的内容对作者来说是可行的。然而,正如你所说,通过创建一个VAO,我必须包含一个以前在索引之外缺失的状态。非常感谢。我认为对glUnmapBuffer()的调用是不必要的,因为您首先没有使用glMapBuffer()。
glBindBuffer( GL_ARRAY_BUFFER, posSSbo );
glVertexPointer( 4, GL_FLOAT, 0, (void *)0 );
glEnableClientState( GL_VERTEX_ARRAY );
glDrawArrays( GL_POINTS, 0, NUM_PARTICLES );
glDisableClientState( GL_VERTEX_ARRAY );
glBindBuffer( GL_ARRAY_BUFFER, 0 );