0

光沢係数をバンプ マッピング シェーダーに送信する際に問題が発生しました。結果は常に次のようになります: http://i.imgur.com/unzdx.jpg

しかし、シェーダー内の値を 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);
4

2 に答える 2

1

pow(0, 0) は未定義であることに注意してください。これは、と のspec場合は未定義であることを意味します。dot(r, e) == 0fShininess == 0

于 2012-04-22T00:55:28.577 に答える
0

glUniformを呼び出すときに、プログラムがアクティブにバインドされていることを確認しますか?どこかでglGetErrorをチェックしますか?

于 2012-04-21T20:27:55.890 に答える