GLSL着色器问题

时间:2016-07-09 03:42:57

标签: opengl glsl

我为程序创建了两个着色器来渲染简单对象。

顶点着色器源:

#version 400 core
layout (location = 1) in vec4 i_vertexCoords;
layout (location = 2) in vec3 i_textureCoords;
layout (location = 3) in vec3 i_normalCoords;
layout (location = 4) in int i_material;

uniform mat4 u_transform;

out VertexData {
    vec3 textureCoords;
    vec3 normalCoords;
    int material;
} vs_out;

void main() {
    vs_out.textureCoords = i_textureCoords;
    vs_out.material = i_material;
    gl_Position = u_transform * i_vertexCoords;
    vs_out.normalCoords = gl_Position.xyz;
}

片段着色器源:

#version 400 core
struct MaterialStruct {
    int ambientTexutre;
    int diffuseTexture;
    int specularTexture;
    int bumpTexture;

    vec4 ambientColor;
    vec4 diffuseColor;
    vec4 specularColor;

    float specularComponent;
    float alpha;
    int illuminationModel;
};

in VertexData {
    vec3 textureCoords;
    vec3 normalCoords;
    int material;
} vs_out;

layout (std140) uniform MaterialsBlock {
    MaterialStruct materials[8];
} u_materials;

uniform sampler2D u_samplers[16];

out vec4 fs_color;


void main() {
    MaterialStruct m = u_materials.materials[vs_out.material];
    fs_color = vec4(m.diffuseColor.rgb, m.diffuseColor.a * m.alpha);
}

使用这两个着色器创建的程序呈现图片2  axes 当我将main()函数内容更改为next:

void main() {
    MaterialStruct m = u_materials.materials[vs_out.material];
    fs_color = vec4(m.diffuseColor.rgb * (vs_out.normalCoords.z + 0.5), m.diffuseColor.a * m.alpha);
}

它呈现图片1,但材料仍然存在(如果我试图从u_materials.materials手动选择材料,它可以工作)。 Shader认为vs_out.material是常数且等于0,但事实并非如此。数据未更改(不包括转换矩阵) 有人可以解释这个问题的解决方案吗?

1 个答案:

答案 0 :(得分:2)

第4.3.4节中的GLSL 4.5 spec个状态"输入变量":

  

片段着色器输入,它们是有符号或无符号整数,整数向量或任何双精度   必须使用插值限定符new限定浮点类型。

您不能对这些类型使用插值,实际上,您的代码不应该在严格的实现上进行编译。