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);
}
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,但它不是。數據不變(不包括轉換矩陣) 有人可以解釋這個問題的解決方案嗎?
不知道我理解你的評論'Shader認爲vs_out.material是恆定的並且等於0,但它不是'。片段着色器中唯一的變化似乎是使用'(vs_out.normalCoords.z + 0.5)'作爲顏色計算中的乘數。鑑於圖1中的顏色看起來被漂白了,有可能「vs_out.normalCoords.z」有一些大的值? –
不確定您期望將顏色與法線分量+ 0.5相乘。另外,在頂點着色器中不確定:'vs_out.normalCoords = gl_Position.xyz;'。這絕對不是頂點的法線。 – MadEqua
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'。 –