首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

干OpengL着色器的,看过来呀

2013-02-02 
做OpengL着色器的,看过来呀我把着色器放在场景中,开启场景灯光,但是模型还是全黑的呀,怎么办,能把着色器里

做OpengL着色器的,看过来呀
我把着色器放在场景中,开启场景灯光,但是模型还是全黑的呀,怎么办,能把着色器里的设的条件达到了呢?direction是视点与模型上的ecPosition的方向的单位向量,bool distance判断模型上的vectex是否在视点可达到的距离内,达到返回真
(1)部分代码注释        
        “yuXian=dot(direction,centerLine);\n"计算视域中心线与direction的余弦值

        "        dirNormal=dot(direction,normal);\n"计算direction与每个顶点的法向量之间的夹角theta的余弦值(theta>90.0f 为负数)

        "        if(dis<length(end-LightPosition))\n"判断条件
                 "        distance=true;\n"
2)片元着色器的判断条件
        "if(yuXian<spotDot&&distance&&dirNormal>=0)\n"
        "gl_FragColor = color;\n"
如果视域范围角度angle的余弦值大于视线与direction之间角度的余弦值,同时distance返回真,同时dirNormal为整数(即夹角theta<=90),满足上面的条件的片元将被着色为color的颜色。

static const char* vertSource = {
"uniform vec3 LightPosition;\n"
"uniform vec3 end;\n"
"varying bool tance;\n"
"varying float yuXian ;\n"
"varying float dirNormal;\n"
"void main()\n"
"{\n"
"vec3 ecPosition=vec3(gl_ModelViewMatrix*gl_Vertex);\n"
"vec3 normal = normalize(gl_NormalMatrix * gl_Normal);\n"
"gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;\n"
"vec3 direction=normalize(ecPosition-LightPosition);\n"
"vec3 centerLine=normalize(end-LightPosition);\n"
"float dis=length(ecPosition-LightPosition);\n"
"yuXian=dot(direction,centerLine);\n"
"dirNormal=dot(direction,normal);\n"
"if(dis<length(end-LightPosition))\n"
    "tance=true;\n"
"else\n"
"tance=false;\n"
"}\n"
};
static const char* fragSource = {
"varying bool tance;\n"
"varying float yuXian ;\n"
"varying float dirNormal;\n"
"uniform float angle;\n"
"uniform vec4 color;\n"

"void main()\n"
"{\n"
"float spotDot=cos(0.5*angle);\n"
"if(yuXian<spotDot&&tance&&dirNormal>=0)\n"
"gl_FragColor = color;\n"
"}\n"
};

void createShaders( osg::ref_ptr <osg::Node> node)
{
osg::StateSet *ss=node->getOrCreateStateSet();
osg::ref_ptr<osg::Program> program = new osg::Program;

osg::ref_ptr<osg::Shader> vertShader = new osg::Shader( osg::Shader::VERTEX, vertSource );  //顶点着色器
program->addShader( vertShader.get() );

osg::ref_ptr<osg::Shader> fragShader = new osg::Shader( osg::Shader::FRAGMENT, fragSource );//片元着色器
program->addShader( fragShader.get() );


osg::ref_ptr<osg::Uniform> LightPosition = new osg::Uniform( "LightPosition", osg::Vec3(1.0,0.5,5) );
ss->addUniform( LightPosition.get() );

osg::ref_ptr<osg::Uniform> end = new osg::Uniform( "end", osg::Vec3(1.0,0.5,1) );
ss->addUniform( end.get() );

osg::ref_ptr<osg::Uniform> angle = new osg::Uniform( "angle",1.884f );
ss->addUniform( angle.get() );

osg::ref_ptr<osg::Uniform> color = new osg::Uniform( "color", osg::Vec4(1.0f,0.0f,0.0f,1.0f));


ss->addUniform( color.get() );

ss->setAttributeAndModes( program.get() );
}
添加着色器后,模型是黑色的,原模型有光照的。
[解决办法]
最近正在看着色器,没弄明白,但是据说默认的灯光效果对着色器是不起作用的,必须重新计算

热点排行