opengl GLSL几何着色器导致RenderDoc中出现“绘制时未绑定顶点着色器”

mnemlml8  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(188)

我试图让一个基本的几何着色器工作,但我完全失败了。在检查了大量的资源,我仍然找不到解决我的问题。
下面是我的顶点、几何体和碎片着色器的代码。
顶点着色器:

#version 330 core

// Vertex Shader Inputs
layout (location = 0) in vec3 Pos;
layout (location = 1) in vec3 Norm;
layout (location = 2) in vec3 Color;

// Vertex to Fragment Shader Outputs
out DATA {
    vec3 vsPos;
    vec3 vsNorm;
    vec4 vsColor;
} data_out;

// Main.cpp Imports
uniform mat4 camMatrix; // viewProjection Matrix
uniform mat4 model;

void main()
{
    vec3 vsPos   = vec3(model * vec4(Pos, 1.0f));
    vec3 vsNorm  = mat3(transpose(inverse(model))) * Norm; // Normal vector correction
    vec4 vsColor = vec4(Color, 1.0f);

    gl_Position = camMatrix * vec4(vsPos, 1.0f);
}

几何着色器:

#version 330 core

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

out vec3 gsPos;
out vec3 gsNorm;
out vec3 gsColor;

in DATA {
    vec3 vsPos;
    vec3 vsNorm;
    vec4 vsColor;
} data_in[];

uniform mat4 camMatrix;

void main()
{
    for (int i=0; i<3; i++)
    {   
            gsPos = data_in[i].vsPos;
            gsNorm = data_in[i].vsNorm;
            gsColor = data_in[i].vsColor;
        gl_Position = camMatrix * vec4(data_in[i].vsPos, 1.0f);
        EmitVertex();
    }
    EndPrimitive();
}

片段着色器:

#version 330 core

out vec4 FragColor;

// Fragment Shader Inputs
in vec3 gsPos;
in vec3 gsNorm;
in vec4 gsColor;

// Fragment Shader Uniforms
uniform sampler2D diffuse0;
uniform sampler2D specular0;

uniform vec4 lightColor;
uniform vec3 lightPos;

uniform vec3 camPos;

vec4 pointLight()
{   
    vec3 lightVec = (lightPos - vsPos);

// intensity of light with respect to distance
    float dist  = length(lightVec);
    float a     = 0.7;
    float b     = 0.4;
    float c     = 1.0;
    float inten = 1.0f / (a * dist * dist + b * dist + c);

// ambient lighting
    float ambient = 0.75f;

// diffuse lighting
    vec3  fsNorm         =  normalize(gsNorm);
    vec3  lightDirection =  normalize(lightVec);
    float diffuse        =  max(dot(fsNorm, lightDirection), 0.0f);

// specular lighting
    float specular = 0.0f;
    if (diffuse != 0.0f)
    {
        float specularLight  =  0.50f;
        vec3  viewDirection  =  normalize(gsNorm - gsPos);
        vec3  halfwayVec     =  normalize(viewDirection + lightDirection);
        float specAmount     =  pow(max(dot(fsNorm, halfwayVec), 0.0f), 32);
        
        specular = specAmount * specularLight;
    };

    return inten * (gsColor * (diffuse + ambient) + gsColor * specular) * lightColor;
}

void main()
{// outputs final color
    FragColor = pointLight();
}


我的网格生成函数:

void genMesh()
    {
        VAO.Bind();
        VBO VBO(vtx);
        EBO EBO(idx);
        VAO.LinkAttrib(VBO, 0, 3, GL_FLOAT, sizeof(Vertex), (void*)0);
        VAO.LinkAttrib(VBO, 1, 3, GL_FLOAT, sizeof(Vertex), (void*)(3 * sizeof(float)));
        VAO.LinkAttrib(VBO, 2, 4, GL_FLOAT, sizeof(Vertex), (void*)(6 * sizeof(float)));

        VAO.Unbind();
        VBO.Unbind();
        EBO.Unbind();
    };

我的网格绘制功能:

void Mesh::Draw(Shader& shader, Camera& camera)
{
    shader.Activate();
    VAO.Bind();

    // Take care of the camera Matrix
    glUniform3f(glGetUniformLocation(shader.ID, "camPos"),
        camera.Position.x,
        camera.Position.y,
        camera.Position.z);
    camera.Matrix(shader, "camMatrix");

    // Draw the actual mesh
    glDrawElements(GL_TRIANGLES, idx.size() * sizeof(GLuint), GL_UNSIGNED_INT, 0);
};

我在main while循环外调用网格生成函数,然后在main while循环中绘制网格。
通过RenderDoc调试我的程序时,我出现了错误:“绘制时没有顶点着色器绑定!”没有几何着色器(保持其他一切大致相同),我在RenderDoc中没有出现任何错误。我试图更新我的图形驱动程序,但我只是遇到了同样的错误。请帮助我,我感觉我疯了。

t98cgbkg

t98cgbkg1#

在片段着色器中,gsColor在vec4变量中定义,但在几何着色器中,它声明为vec3变量

相关问题