【发布时间】:2014-04-30 22:40:49
【问题描述】:
我正在尝试通过
out float texture_contribs[16]
使用 glsl 3.3 从顶点着色器到帧着色器
但是,无论顶点着色器中的值如何,帧着色器中的值始终为 0.0。
这是我的顶点着色器代码:
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 normalMatrix;
layout(location = 0) in vec4 in_position;
layout(location = 1) in vec4 in_colour;
layout(location = 2) in vec2 in_coord;
layout(location = 3) in vec3 in_normal;
layout(location = 4) in float texture_contributions[16];
out vec2 texcoord;
out vec4 pass_colour;
out float texture_contribs[16];
smooth out vec3 vNormal;
void main()
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_position;
texcoord = in_coord;
vec4 vRes = normalMatrix*vec4(in_normal, 0.0);
vNormal = vRes.xyz;
pass_colour = in_colour;
for (int i = 0; i < 16; i++)
{
texture_contribs[i] = texture_contributions[i];
}
}
这是片段着色器代码:
uniform sampler2D texture[16];
in vec2 texcoord;
in vec4 pass_colour;
in float texture_contribs[16];
smooth in vec3 vNormal;
out vec4 out_colour;
struct SimpleDirectionalLight
{
vec3 vColor;
vec3 vDirection;
float fAmbientIntensity;
};
uniform SimpleDirectionalLight sunLight;
void main()
{
vec4 vTexColor = texture2D(texture[2], texcoord) * texture_contribs[2] + texture2D(texture[3], texcoord) * texture_contribs[3];
if(vTexColor.a < 0.1)
discard;
float fDiffuseIntensity = max(0.0, dot(normalize(vNormal), -sunLight.vDirection));
out_colour = vTexColor*pass_colour*vec4(sunLight.vColor*(sunLight.fAmbientIntensity+fDiffuseIntensity), 1.0);
}
我尝试将数组拆分为单独的变量并分别传递它们,它们的值仍然在片段着色器中消失。
【问题讨论】:
-
这个:
layout(location = 4) in float texture_contributions[16];让我觉得非常不寻常。这需要 16 个属性槽,并且大多数实现将您限制为总共 16 个。您可以使用layout(location = 4) in mat4 texture_contributions;做同样的事情,同时只占用 4 个属性槽。它将分配给属性槽 4,5,6,7。 -
你真的在检查这个着色器的编译器日志吗?标量与
vec4s 使用相同的存储空间,因此当您将它们聚合到这样的数组中而不是打包到vec4或mat4s 中时,您就是在玩火。 -
是的,我检查了编译器日志,它很干净。我考虑将它们打包成 mat4 但决定以这种方式尝试以获得更清晰的语法。我将尝试将其切换到 mat4 看看是否有帮助
-
@AndonM.Coleman 我能够按照您的建议使用 mat4 使其工作,然后在顶点着色器中将值传输到 float[16] 并将其传递给片段着色器。将 mat4 传递给片段着色器无法正常工作。我假设 opengl 不会以我需要的方式插入矩阵。
-
我会选择你所拥有的。这允许您规避的 16 个属性限制仅适用于 input 顶点数据。您可以按照自己的方式从顶点着色器中输出构建数据,不限于 16 个。