2016-07-09 12 views
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); 
} 

プログラムは、画像2 axes をレンダリング:

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で

+1

私はあなたのコメントを理解していません。シェイダーはvs_out.materialが定数で0に等しいと思っていますが、isn'tです。フラグメントシェーダの唯一の変更は、色計算の乗数として '(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

GLSL 4.5 spec状態「入力変数」:

フラグメントシェーダ署名されている入力または符号なし整数、整数のベクトル、または 浮動小数点型を用いて修飾する必要があり、任意の倍精度補間修飾子flat

これらの型の補間は使用できません。実際は、厳密な実装ではコードをコンパイルするべきではありません。

関連する問題