我想做凹凸/法线/视差贴图,但为此我需要多纹理 - 一次使用2个纹理 - 一个用于颜色,一个用于高度贴图。但是这项任务成就显得有些荒谬。
我有以下顶点着色器的代码:
#version 330 core
/* 0: in
* 1: out
* 2: uniform
*/
// 0: in
layout (location = 0) in vec3 v_vertexPos;
layout (location = 1) in vec2 v_vertexTexCoord;
// 1: out
out vec2 f_vertexTexCoord;
// 2: uniform
uniform mat4 vertexMvp = mat4( 1.0f );
void main()
{
f_vertexTexCoord = v_vertexTexCoord;
gl_Position = vertexMvp * vec4( v_vertexPos, 1.0f );
}
以及片段1的以下内容:
#version 330 core
/* 0: in
* 1: out
* 2: uniform
*/
// 0: in
in vec2 f_vertexTexCoord;
// 1: out
layout (location = 0) out vec4 f_color;
// 2: uniform
uniform sampler2D cTex;
uniform sampler2D hTex;
// #define BUMP
void main()
{
vec4 colorVec = texture2D( cTex, f_vertexTexCoord );
#ifdef BUMP
vec4 bumpVec = texture2D( hTex, f_vertexTexCoord );
f_color = vec4( mix( bumpVec.rgb, colorVec.rgb, colorVec.a), 1.0 );
#else
f_color = texture2D( cTex, f_vertexTexCoord );
#endif
}
着色器被编译并附加到着色器程序。然后链接该程序然后使用。 glGetActiveUniform报告的唯一活动均匀变量是顶点着色器的均匀顶点MVp和片段一的cTex。 hTex无法识别并查询其位置,结果为-1。图形卡支持GL_ARB_multitexture OpenGL扩展(支持最高4.3的OpenGL版本)。
测试了提供here的简单多纹理示例,该示例仅使用stock vertex one定义了片段着色器。这个例子就像一个魅力。
有什么建议吗?
答案 0 :(得分:4)
“GLSL编译器和链接器试图尽可能高效。因此,他们尽力消除不影响阶段输出的代码。因此,不必在着色器文件中定义统一链接程序中可用。仅当影响舞台输出的代码使用该制服时才可用,并且制服本身可以改变舞台的输出。
因此,由完全链接的程序暴露的制服被称为“主动”制服;原始着色器指定的任何其他制服均处于非活动状态。非活动制服不能用于在程序中执行任何操作。“ - OpenGL.org
由于片段着色器中未定义BUMP,因此hTex不会在您的代码中使用,因此不是活动的统一。这是预期的行为。