查看: 858|回复: 3

面模型显示问题

[复制链接]

该用户从未签到

发表于 2013-8-8 10:40:06 | 显示全部楼层 |阅读模式
       各位老师好,作为osg菜鸟,我这里有一个问题。我使用了cookbook中的Dynamically lighting within shaders代码,然后导入了一个面模型,可是只有一面有效果,另外一面是黑色的。如果导入一个OSG中自带的体模型,比如cow.osg,效果是很好的,模型的上下左右都体现的很立体,但是如果导入其自带的面模型,比如lz.osg,也就又是一面有效果,一面是黑色的。想问一下各位老师,这是什么问题,应该怎样解决呢,谢谢了。
       f41.png
       这是自己的面模型有效果的一面,显示的很好。
       f42.png
       这是另外一面,黑色的,没有任何效果。
       f43.png
       这是正反两面的对比。
       lz1.png
       这是lz.osg的一面的效果。
       lz2.png
       这是另外一面的效果,也是黑色的。
      

这是cow.osg的效果,各个角度都很好。

这是cow.osg的效果,各个角度都很好。

       这是cow.osg的效果,各个角度都很好。
       拜托给位老师看看这是什么问题,应该如何解决,谢谢各位。

该用户从未签到

发表于 2013-8-8 13:03:31 | 显示全部楼层
这是面的法线导致的  

该用户从未签到

 楼主| 发表于 2013-8-8 13:09:11 | 显示全部楼层
可以说的详细一点吗?谢谢。代码是这样的:
static const char* vertSource = {
    "uniform vec3 lightPosition;\n"
    "varying vec3 normal, eyeVec, lightDir;\n"
    "void main()\n"
    "{\n"
    "    vec4 vertexInEye = gl_ModelViewMatrix * gl_Vertex;\n"
    "    eyeVec = -vertexInEye.xyz;\n"
    "    lightDir = vec3(lightPosition - vertexInEye.xyz);\n"
    "    normal = gl_NormalMatrix * gl_Normal;\n"
    "    gl_Position = ftransform();\n"
    "}\n"
};

static const char* fragSource = {
    "uniform vec4 lightDiffuse;\n"
    "uniform vec4 lightSpecular;\n"
    "uniform float shininess;\n"
    "varying vec3 normal, eyeVec, lightDir;\n"
    "void main (void)\n"
    "{\n"
    "  vec4 finalColor = gl_FrontLightModelProduct.sceneColor;\n"
    "  vec3 N = normalize(normal);\n"
    "  vec3 L = normalize(lightDir);\n"
    "  float lambert = dot(N,L);\n"
    "  if (lambert > 0.0)\n"
    "  {\n"
    "    finalColor += lightDiffuse * lambert;\n"
    "    vec3 E = normalize(eyeVec);\n"
    "    vec3 R = reflect(-L, N);\n"
    "    float specular = pow(max(dot(R, E), 0.0), shininess);\n"
    "    finalColor += lightSpecular * specular;\n"
    "  }\n"
    "  gl_FragColor = finalColor;\n"
    "}\n"
};

class LightPosCallback : public osg::Uniform::Callback
{
public:
    virtual void operator()( osg::Uniform* uniform, osg::NodeVisitor* nv )
    {
        const osg::FrameStamp* fs = nv->getFrameStamp();
        if ( !fs ) return;
        
        float angle = osg::inDegrees( (float)fs->getFrameNumber() );
        uniform->set( osg::Vec3(20.0f * cosf(angle), 20.0f * sinf(angle), 1.0f) );
    }
};

int main( int argc, char** argv )
{
    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile( "datam/f4.osg" );

    osg::ref_ptr<osg:rogram> program = new osg::Program;
    program->addShader( new osg::Shader(osg::Shader::VERTEX, vertSource) );
    program->addShader( new osg::Shader(osg::Shader::FRAGMENT, fragSource) );
   
    osg::StateSet* stateset = model->getOrCreateStateSet();
    stateset->setAttributeAndModes( program.get() );
    stateset->addUniform( new osg::Uniform("lightDiffuse", osg::Vec4(0.8f, 0.8f, 0.8f, 1.0f)) );
    stateset->addUniform( new osg::Uniform("lightSpecular", osg::Vec4(1.0f, 1.0f, 0.4f, 1.0f)) );  
    stateset->addUniform( new osg::Uniform("shininess", 64.0f) );

    osg::ref_ptr<osg::Uniform> lightPos = new osg::Uniform( "lightPosition", osg::Vec3() );
    lightPos->setUpdateCallback( new LightPosCallback );
    stateset->addUniform( lightPos.get() );

    osgViewer::Viewer viewer;
    viewer.setSceneData( model.get() );
    return viewer.run();
}

该用户从未签到

发表于 2013-8-12 09:43:17 | 显示全部楼层
说的很明确了,法线的问题。法线决定了光照的强度以及所谓的“立体”效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表