在GLSL中,当我尝试将一个包含sampler2D属性的统一结构体传递给一个前向声明的函数时,似乎存在着着色器链接错误。如果我删除前向声明并将函数移动到main之上,代码能够正常工作。这是不合法的代码吗?
#version 330 core
in vec2 texcoords;
out vec4 color;
struct Material{
sampler2D tex; // Sampler inside a struct
};
uniform Material material;
// Forward Declaration
vec4 add(Material m);
void main() {
color = add(material);
}
// Function Definition
vec4 add(Material m) {
return vec4(texture(m.tex, texcoords));
}
// C++
glUniform1f(glGetUniformLocation(shader, "material.tex"), 0);
glBindTexture(GL_TEXTURE_2D, texture);
编辑:
经过一番搜索,发现这是AMD驱动程序中的一个错误。我个人使用的是相当古老的ATI Mobility Radeon HD 4670,但它仍然可以运行OpenGL 3.3。在AMD的论坛上,我找到了一个类似的帖子,因此有趣的是要知道这对AMD图形卡有多大影响。因为如果您在英特尔或NVIDIA上进行开发,那么您怎么知道您的着色器不会在某些AMD图形卡上编译?我们应该保持安全,不使用具有采样器的结构体原型,甚至完全不将采样器放入结构体中吗?... 值得注意的是,WebGL甚至不允许在结构体内部使用采样器。
错误信息:
Vertex shader(s) failed to link, fragment shader(s) failed to link.
unexpected error.
unexpected error.
glUniform1i
而不是glUniform1f
。 - Joey Dewd