当我更改着色器中与这些统一无关的代码行时,向着色器(GLSL)发送数据失败

Sending data to the shader(GLSL) is failing when I change a line of code in the shader that has nothing to do with those uniforms

本文关键字:GLSL 失败 数据 代码      更新时间:2023-10-16

使用Jon茶壶教程在着色器管理器系统上工作。目前正在尝试将它与我的代码集成,并找出为什么没有绘制任何内容。

当找不到制服时,我会使用以下代码将错误消息打印到控制台

GLuint ShaderProgram::getUniformLocation(std::string _name) const
{
GLint loc = glGetUniformLocation( m_ProgramID, _name.c_str() );
if( loc == -1 )
{
std::cerr << "Uniform "" << _name.c_str() << "" not found in program "" <<m_ProgramName.c_str() << ""n";
}
return loc;
}

所以,当我正常发送制服时,它不会显示任何错误,尽管没有任何平局。为了查看着色器是否正确接收到顶点或任何内容,我尝试避免使用照明计算或其他任何内容,并尝试仅输出具有完整alpha的颜色。因此更改了我的片段输出:

out_Color = vec4(finalColour, 1.0) * texture(textureUnit0, ex_TexCoord);

它考虑了纹理和照明计算(这就是最终颜色)。我把它改为:

out_Color = vec4(1.0f, 1.0f, 1.0f, 1.0f);

我的控制台现在显示找不到我的轻型和材料制服?当这不涉及在着色器中找到这些制服时?那为什么会影响它呢?

我在着色器中定义了一个材质和灯光结构,并使用它来接收gpu的统一。

类似:

struct lightStruct
{
vec4 ambient;
vec4 diffuse;
vec4 specular;
};
struct materialStruct
{
vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
};
uniform lightStruct light;
uniform materialStruct material;

我发送这样的数据(在我声明材料和光结构全球atm之后):

shaderManager.setLight( "Phong-Tex", light0 );
shaderManager.setMaterial( "Phong-Tex", material0 );

这是setlight和setmaterial函数,我知道setUniform函数在这里工作,因为我将它们用于其他变量。

void ShaderManager::setLight(std::string _program, const lightStruct light)
{
auto program = m_ShaderPrograms.find(_program);
//check the program exists
if( program != m_ShaderPrograms.end( ) )
{
program->second->setUniform4fv("light.ambient", 1, light.ambient);
program->second->setUniform4fv("light.diffuse", 1, light.diffuse);
program->second->setUniform4fv("light.specular", 1, light.specular);
program->second->setUniform4fv("lightPosition", 1, light.position);
}
else{std::cerr << "Program " <<_program <<" could not be found in shader manager getProgramID" << " /n " ;}
}
void ShaderManager::setMaterial(std::string _program, const materialStruct material)
{
auto program = m_ShaderPrograms.find(_program);
//check the program exists
if( program != m_ShaderPrograms.end( ) )
{
program->second->setUniform4fv("material.ambient", 1, material.ambient);
program->second->setUniform4fv("material.diffuse", 1, material.diffuse);
program->second->setUniform4fv("material.specular", 1, material.specular);
program->second->setUniform1f("material.shininess", material.shininess);
}
else{std::cerr << "Program " <<_program <<" could not be found in shader manager getProgramID" << " /n " ;}
}

据我所知,它应该起作用。如果你们需要更多的代码/信息,请告诉我。试着给出所有我认为相关的东西。

这是预期的行为。未使用的统一格式将在编译的着色器之外进行优化,并且对glGetUniformLocation不可见。如果在中间计算中使用变量,并且该计算的结果未用于计算声明为out(或兼容模式着色器中的varyinggl_FragColor)的任何变量,则仍然会发生这种情况。