当我更改着色器中与这些统一无关的代码行时,向着色器(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
使用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
(或兼容模式着色器中的varying
或gl_FragColor
)的任何变量,则仍然会发生这种情况。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- 为什么我的GLSL着色器失败汇编而没有错误消息
- 当我更改着色器中与这些统一无关的代码行时,向着色器(GLSL)发送数据失败
- glsl顶点着色器glGetUniformLocation失败
- GLSL编译失败,没有错误日志
- GLSL编译失败,但没有错误消息