【发布时间】:2014-02-20 15:13:07
【问题描述】:
我想做凹凸/法线/视差映射,但为此我需要多重纹理 - 一次使用 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 );
}
片段一如下:
#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 唯一报告的活动统一变量是顶点着色器的统一 vertexMvp 和片段一个的 cTex。 hTex 未被识别并查询其位置,结果为 -1。显卡支持GL_ARB_multitexture OpenGL扩展(支持OpenGL版本最高4.3)。
测试了here 提供的简单多纹理示例,它只定义了片段着色器,使用股票顶点之一。这个例子就像一个魅力。
有什么建议吗?
【问题讨论】:
-
如果不使用制服,着色器编译器会将它们优化掉。在这种情况下,您将获得 -1 作为他们的位置。
-
完全正确的答案。
-
没有错。您已将着色器中实际使用
hTex的部分进行了预处理。链接器将确定统一在链接程序中处于非活动状态,并且不会分配统一位置。这本身不是优化,编译器也不会这样做。
标签: c++ opengl textures glsl shader