【问题标题】:glUseProgram not loading shader in modelglUseProgram 未在模型中加载着色器
【发布时间】:2020-04-10 01:29:51
【问题描述】:

我有一个代码结构,其中包含一个带有渲染循环的 Render、一个 Shader 类和一个 Model 类。当我在渲染器中实现着色器时,我可以让它们工作,但我希望将它们分配给模型并调用 render(),但是我有一个奇怪的问题,着色器在模型,但不在内部。

着色器结构:

class Shader
{
public:
unsigned int ID;

// constructor generates the shader on the fly
// ------------------------------------------------------------------------
Shader(const char* vertexPath, const char* fragmentPath, const char* geometryPath = nullptr)
{
... Generate shaders...

//Assign program ID to the public unsigned int
ID = glCreateProgram();

...attach shaders to program and link...

}

//Install program for use in rendering
void use()
{
    glUseProgram(ID);
}
}

模型结构:

class TextureModel
{
public:
    TextureModel(const std::string modelPath, const std::string texturePath)
{
...Initialize model, load in mesh,texture, create a VAO with vertex and
   index VBOs, set glAttribArray values...
}

Render(Shader* shader)
{
    //glUseProgram(4)    <---------- (3)

    shader->use();       <---------- (1)

    glBindVertexArray(VAO);
    glBindTexture(GL_TEXTURE_2D, texture);
    glDrawElements(GL_TRIANGLES, IBO->GetCount(), GL_UNSIGNED_INT, (void*)0);
    glBindVertexArray(0);
}
}

渲染器结构:

Shader* texShader;
TextureModel* Reindeer;

int main()
{
    texShader = new Shader("Shaders/camera.vs", "Shaders/textured.fs", "Shaders/passThrough.gs");

    Reindeer = new TextureModel("Models/reindeer_v1/reindeer_v1.obj", 
                                "Models/reindeer_v1/reindeer_diffuse.jpg");

    while (!glfwWindowShouldClose(window))
    {

     ...Update camera, project and model matrices. Update the shader uniforms...

    //texShader->use()   <---------- (2)

    Reindeer->Render(texShader);
    glfwSwapBuffers(window);
    }
}

上面的代码没有渲染我的对象。

在第 (1) 点,我的模型调用 TextureModel::Render(Shader*) 传入的 texShader->use()。出于某种原因,这不起作用,但是如果我从渲染循环中调用 texShader->use() 它可以工作,这是在点 (2)。

同样在调试中我发现创建时分配给 texShader 的程序 ID 是 4。如果我将 glUseProgram(4) 放在 model::Render(Shader*) 块中,这也可以。第 (3) 点。

为什么 glUseProgram() 函数在所有情况下都有效,除非传入我的模型?我真的对这个感到困惑。

【问题讨论】:

  • 当你踏入-&gt;use()时,你是否验证过TexShader.ID是否仍然正确?这闻起来像内存损坏。
  • 是的,它是一样的。我弄清楚了问题所在。原来我的几何着色器有问题(不在上面的片段中),这阻止了将值传递给片段着色器。整理出来后,我设法从模型中调用它。我不太确定我做了什么来解决这个问题......对不起。但它现在完成了。如果我知道具体发生了什么,我会更新。

标签: c++ opengl shader rendering


【解决方案1】:

看来我已经修好了。

我已经在上面总结了我的问题,但实际上我为不同的对象使用了两个不同的着色器。

两者共享相同的顶点着色器(使用自己的模型矩阵,带有相机统一缓冲区对象),使用不同的片段着色器,并共享几何着色器。

由于某种原因,我一次只能让一个几何着色器实例工作...我需要进一步调查。

不管怎样,我已经解决了上述问题。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2014-04-30
    • 1970-01-01
    • 2015-07-09
    • 2023-03-03
    • 2012-01-18
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多