2
シンプルなオブジェクトをレンダリングするために私のプログラム用に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;
}
フラグメントシェーダソース:私は次のmain()
機能の内容を変更する場合、この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と等しいと考えますが、そうではありません。データは変更されません(変換行列を除く) 誰かがこの問題の解決方法を説明できますか?セクション4.3.4で
私はあなたのコメントを理解していません。シェイダーはvs_out.materialが定数で0に等しいと思っていますが、isn'tです。フラグメントシェーダの唯一の変更は、色計算の乗数として '(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'に置き換えることです。 –