【发布时间】: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() 函数在所有情况下都有效,除非传入我的模型?我真的对这个感到困惑。
【问题讨论】:
-
当你踏入
->use()时,你是否验证过TexShader.ID是否仍然正确?这闻起来像内存损坏。 -
是的,它是一样的。我弄清楚了问题所在。原来我的几何着色器有问题(不在上面的片段中),这阻止了将值传递给片段着色器。整理出来后,我设法从模型中调用它。我不太确定我做了什么来解决这个问题......对不起。但它现在完成了。如果我知道具体发生了什么,我会更新。
标签: c++ opengl shader rendering