2016-07-09 158 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

你不能對這些類型使用插值,實際上,你的代碼不應該在嚴格的實現上編譯。