2012-04-21 106 views
0

我一直有问题发送shininess因素到我的凹凸映射着色器。 结果总是看起来是这样的:http://i.imgur.com/unzdx.jpg将float传递给GLSL着色器什么都不做

但是,如果我硬代码着色器内部的价值为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 2012-04-21 20:11:12

+0

编辑它,对不起忘了:) – Lngly 2012-04-21 20:19:46

回答

1

请注意pow(0,0)未定义。这意味着spec未定义,如果dot(r, e) == 0fShininess == 0

+0

我想这是问题所在。我稍后会检查出来。谢谢 – Lngly 2012-04-22 08:35:43

+0

但事情是,如果我将着色器内的fShininess硬编码为0.0,那么它工作正常。 如果我将0.0发送到着色器 - >黑色斑点。 – Lngly 2012-04-23 00:52:40

+0

如果在着色器中将其设置为“0.0f”,该怎么办?我不知道;在UB和我缺乏错综复杂的知识之间,这很难推测。 – aib 2012-04-23 11:28:37

0

你确保程序正在积极约束时你叫glUniform?你在任何地方检查glGetError吗?

+0

不,我没有,但其他值似乎是罚款。如果我将镜面部分移开或将其设置为0.0,则照明工作正常。如果程序没有绑定,情况就不是这样,对吗? – Lngly 2012-04-21 20:32:49

+0

请手动检查glGetError和glGetUniformLocation的返回值。它可以节省大量的调试时间以确定地知道。 – Tim 2012-04-21 20:35:07

+0

错误始终是0 位置是3 这是与GLint loc = ...代码从上面 – Lngly 2012-04-21 20:46:10

相关问题