2016-07-09 161 views
2

我为我的程序创建了两个着色器来渲染简单对象。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; 
} 

片段着色器源:与此2个着色器创建

#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()函数内容到下一个:

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

不知道我理解你的评论'Shader认为vs_out.material是恒定的并且等于0,但它不是'。片段着色器中唯一的变化似乎是使用'(vs_out.normalCoords.z + 0.5)'作为颜色计算中的乘数​​。鉴于图1中的颜色看起来被漂白了,有可能“vs_out.normalCoords.z”有一些大的值? –

+0

不确定您期望将颜色与法线分量+ 0.5相乘。另外,在顶点着色器中不确定:'vs_out.normalCoords = gl_Position.xyz;'。这绝对不是顶点的法线。 – MadEqua

+0

vs_out.normalCoords只是这个着色器对中顶点的gl_Position。 vs_out.normalCoords.z适合范围[0.1 .. 0.9]。当我将'MaterialStruct m = u_materials.materials [vs_out.material]'中的'vs_out.material'更改为显式值(0,1或2)时,完整模型相应地将颜色更改为灰色,红色和白色。着色器的问题是在编译着色器时将'vs_out.material'替换为'0'。 –

回答

2

在节4.3.4 GLSL 4.5 spec状态“输入变量”:

已签名片段着色器输入或无符号的整数,整数向量,或任何双精度 浮点类型必须与合格插值限定符flat

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