[osg-users] Why are my shaders not being used?
Antoine Rennuit
antoinerennuit at hotmail.com
Fri Jan 19 10:45:09 PST 2018
Hi all,
The following code renders the square in red (fixed pipeline) rather green (shaders), I guess the shaders are not used.
Code:
#define GLSL330(program) "#version 150\n" #program
const char* vertSource = GLSL330
(
void main(void)
{
gl_Position = ftransform();
}
);
const char* fragSource = GLSL330
(
void main(void)
{
gl_FragColor = vec4(0,1,0,1);
}
);
////////////////////////////////////////////////////////////////////////////////
osg::ref_ptr<osg::Geode> SetupNurbsSurface()
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
assert(geode);
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
assert(geometry);
osg::ref_ptr<osg::Vec3Array> vertices_osg = new osg::Vec3Array();
assert(vertices_osg);
osg::ref_ptr<osg::Vec3Array> normals_osg = new osg::Vec3Array();
assert(normals_osg);
osg::ref_ptr<osg::DrawElementsUInt> triangles_osg = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
assert(triangles_osg);
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array();
assert(colors);
// Setup.
geode->addDrawable(geometry);
geometry->setVertexArray(vertices_osg);
geometry->setNormalArray(normals_osg);
geometry->addPrimitiveSet(triangles_osg);
geometry->setColorArray(colors);
// Vertices.
vertices_osg->push_back(osg::Vec3(-1.0f, 0.0f, 1.0f));
vertices_osg->push_back(osg::Vec3(-1.0f, 0.0f, 2.0f));
vertices_osg->push_back(osg::Vec3(-1.0f, -1.0f, 2.0f));
vertices_osg->push_back(osg::Vec3(-1.0f, -1.0f, 1.0f));
// Triangles (primitive sets).
triangles_osg->push_back(0);
triangles_osg->push_back(1);
triangles_osg->push_back(2);
triangles_osg->push_back(0);
triangles_osg->push_back(2);
triangles_osg->push_back(3);
// Colors.
colors->setBinding(osg::Array::BIND_OVERALL);
colors->push_back(osg::Vec4f(1.0f, 0.0f, 0.0f, 1.0f));
// Normals.
normals_osg->setBinding(osg::Array::BIND_PER_VERTEX);
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals_osg->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
// State.
osg::ref_ptr<osg::Shader> vertShader = new osg::Shader( osg::Shader::VERTEX, vertSource );
osg::ref_ptr<osg::Shader> fragShader = new osg::Shader( osg::Shader::FRAGMENT, fragSource );
osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader( vertShader.get() );
program->addShader( fragShader.get() );
osg::ref_ptr<osg::StateSet> state = geode->getOrCreateStateSet();
assert(state);
state->setAttributeAndModes( program.get(), osg::StateAttribute::ON );
// state->addUniform("TODO");
return geode;
}
Any idea of what is going on?
Thanks!
Regards,
Antoine[/code]
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=72803#72803
More information about the osg-users
mailing list