2012-04-21 9 views
0

私は、shininess係数をバンプマッピングシェーダに送信する際に問題が発生しています。 結果は常に次のようになります。http://i.imgur.com/unzdx.jpgGLSLシェーダにfloatを渡すと何も起こりません

ただし、シェーダー内の値を0.0にハードコードするとうまくいきます。 シェーダに0.0を送ると、上の図のようになります。

アイデア?

ここに私のシェーダ

#version 110 

uniform sampler2D tex; 
uniform sampler2D bmap; 

uniform bool boolBump; 
uniform vec4 vecColor; 
uniform bool onlyColor; 

uniform float fTransparencyThresh; 
uniform float fShininess; 
uniform float alpha; 

varying vec3 vecLight; 
varying vec3 vecEye; 
varying vec3 vecNormal; 

vec4 getLighting() 
{ 
    //Ambient part 
    vec4 color = (gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) + (gl_LightSource[0].ambient * gl_FrontMaterial.ambient); 

    //For bump mapping, the normal comes from the bump map texture lookup 
    vec3 n = normalize(vecNormal); 
    if(boolBump) 
    { 
     n = normalize(texture2D(bmap, gl_TexCoord[0].st).xyz * 2.0 - 1.0); 
    } 

    vec3 l = normalize(vecLight); 

    //Lambert term 
    float NdotL = dot(n, l); 

    if(NdotL > 0.0) 
    { 
     //Diffuse part 
     color += gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * max(0.0, NdotL); 

     //Specular part 
     vec3 e = normalize(vecEye); 
     vec3 r = normalize(-reflect(l,n)); 

     float spec = pow(max(0.0, dot(r, e)), fShininess); 

     color += gl_LightSource[0].specular * gl_FrontMaterial.specular * spec; 
    } 

    return color; 
} 

void main(void) 
{ 
    vec4 texel = texture2D(tex, gl_TexCoord[0].st); 
    if(texel.a < fTransparencyThresh) 
     discard; 

    //Get shading 
     vec4 color = getLighting(); 

    //Color only mode? 
    if(onlyColor) 
    { 
     color *= vecColor; 
    } 
    else 
    { 
     color *= texel; 
    } 

    //Set fragment color, alpha comes from MTL file 
    gl_FragColor = vec4(color.xyz, alpha); 
} 

編集、OpenGLのコードです:

void MyClass::sendToShader(const OBJ::StelModel* pStelModel, Effect cur, bool& tangEnabled, int& tangLocation) 
{ 
    int location; 
    tangEnabled = false; 

    if(cur != No) 
    { 
     location = curShader->uniformLocation("fTransparencyThresh"); 
     curShader->setUniform(location, fTransparencyThresh); 

     location = curShader->uniformLocation("alpha"); 
     curShader->setUniform(location, pStelModel->pMaterial->alpha); 

     location = curShader->uniformLocation("fShininess"); 
     curShader->setUniform(location, 0.0f); 

... 

編集:でも、この文句を言わない仕事:

GLint loc = glGetUniformLocation(curShader->program, "fShininess"); 
glUniform1f(loc, 0.0f); 
+0

また、openglコードも表示してください。 – Tim

+0

編集しました、申し訳ありません忘れてしまいました:) – Lngly

答えて

1

pow(0、0)は未定義です。つまり、dot(r, e) == 0fShininess == 0の場合、specは未定義です。

+0

これは問題だと思います。私は後でそれをチェックします。ありがとう – Lngly

+0

事は、シェーダー内のfshininessを0.0にハードコードするとうまくいきます。 0.0をシェーダ→黒の斑点に送るとします。 – Lngly

+0

シェーダーの中で '0.0f'に設定するとどうなりますか?知りません; UBと複雑な知識の欠如の間に、これは推測するのが難しいです。 – aib

0

あなたがプログラムを積極的にするときバインドされていることを確認しますが、あなたはglUniform?どこでもglGetErrorをチェックしますか?

+0

いいえ、私はそうではありませんが、他の値は問題ありません。私が鏡面部分を取り除くか0.0に設定すると、イルミネーションはうまく動作します。プログラムが拘束されていないのではないでしょうか? – Lngly

+0

glGetErrorとglGetUniformLocationの戻り値の両方を手動でチェックしてください。それは確かに知るために多くのデバッグ時間を節約することができます。 – Tim

+0

エラーは常に0です 場所は3です これは、GLint loc = ...コードから上記 – Lngly

関連する問題