Hi Joel,

> layout (traingle_strip, max_vertices = 3) out;
I doubt this valid GLSL. Try

layout (triangle_strip, max_vertices = 3) out;

instead ;-)

Regards,
-Fred


----- "Joel Graff" <pair_o_gra...@comcast.net> a écrit :

> Hi,
> 
> I've been developing an app in OpenSceneGraph to help me learn
> shaders.  One component of that is to be able to visualize normals
> (surface, lighting, camera, etc.).  I am attempting to implement
> geometry shaders to do this in GLSL 1.5 and OSG 2.9.9.  At present,
> I've had success loading vertex and fragment shaders, but the geometry
> shader implementation eludes me.
> 
> From what little I understand of geometry shaders and GLSL, I don't
> see anything wrong with my shader, but since I can't use RenderMonkey
> to test for compile errors, I could be wrong.
> 
> That said, I've attempted to implement the shader (vertex, geometry
> and fragment), and I don't see any compile errors on the console when
> I run the program in debug mode (using VS2010) and break execution
> just before I run the viewer.  I have set OSG_NOTIFY_LEVEL to DEBUG,
> so I expect that any compile problems with the shaders would be output
> to the console window.  If not, and I have to retrieve the info log
> myself, I'd appreciate some info on how to do that, as attempting to
> do so generates an unhandled exception for me.
> 
> Relevant code:
> 
> Vertex Shader
> 
> 
> Code:
> #version 150
> uniform mat4  osg_ModelViewMatrix;  //from application program.
> uniform mat4  osg_ModelViewProjectionMatrix;
> in vec4       osg_Vertex;     //from vertex buffer from app pgm.
> 
> void main (void) {
>   gl_Position = osg_ModelViewMatrix * osg_Vertex;
> }
> 
> 
> 
> Geometry Shader
> 
> 
> Code:
> #version 150
> layout (triangles) in;
> layout (traingle_strip, max_vertices = 3) out;
> uniform mat4  osg_ProjectionMatrix;  //from application program.
> out vec3      normal;      //to fragment shader.
> 
> void main (void) {
>   vec3        vector1;
>   vec3        vector2;
> 
>   vector1 = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
>   vector2 = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
>   
>   normal = normalize (cross (vector1, vector2));
>   gl_Position = osg_ProjectionMatrix * gl_in[0].gl_Position;
>   EmitVertex ();
> 
>   gl_Position = osg_ProjectionMatrix * gl_in[1].gl_Position;
>   EmitVertex ();
> 
>   gl_Position = osg_ProjectionMatrix * gl_in[2].gl_Position;
>   EmitVertex ();
> 
>   EndPrimitve ();
>   }
> 
> 
> 
> Fragment Shader
> 
> 
> Code:
> #version 150
> in vec3   normal;  //from geometry shader.
> out vec4  color;   //to framebuffer.
> 
> void main (void) {
>   gl_FragColor = vec4 (normal, 1.0);
> }
> 
> 
> 
> OSG Code
> 
> 
> Code:
> void loadShaders (osg::ref_ptr<osg::Group> rootGroup)
> {
>       osg::ref_ptr<osg::Geode> rootGeode (dynamic_cast<osg::Geode *>
> (FindNode(rootGroup, "geode_root")->getFirst()));
>       osg::ref_ptr<osg::Geometry> SAQgeometry (FindGeometry(rootGeode,
> "geometry_ScreenAlignedQuad"));
> 
>       osg::ref_ptr<osg::Shader> vertexShader(
>       osg::Shader::readShaderFile (osg::Shader::VERTEX,
> "C:/OpenSceneGraph/OpenSceneGraph-Data-2.8.0/myShaders/test.vert"));
> 
>       osg::ref_ptr<osg::Shader> geometryShader(
>               osg::Shader::readShaderFile (osg::Shader::GEOMETRY,
> "C:/OpenSceneGraph/OpenSceneGraph-Data-2.8.0/myShaders/test.geom"));
> 
>       osg::ref_ptr<osg::Shader> fragShader(
>       osg::Shader::readShaderFile (osg::Shader::FRAGMENT,
> "C:/OpenSceneGraph/OpenSceneGraph-Data-2.8.0/myShaders/test.frag"));
>        
>     osg::ref_ptr<osg::Program> program (new osg::Program());
> 
>     program->addShader(vertexShader); //new
> osg::Shader(osg::Shader::VERTEX, vertexShaderSource));
>       program->addShader(geometryShader);
>     program->addShader(fragShader); //new
> osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource));
> 
>       program->setParameter( GL_GEOMETRY_VERTICES_OUT_EXT, 3 );
>     program->setParameter( GL_GEOMETRY_INPUT_TYPE_EXT,
> GL_TRIANGLE_STRIP );
>     program->setParameter( GL_GEOMETRY_OUTPUT_TYPE_EXT,
> GL_TRIANGLE_STRIP );
> 
>       program->addBindAttribLocation("osg_Vertex", 0);
>       program->addBindAttribLocation("osg_Normal", 2);
> 
>     SAQgeometry->getOrCreateStateSet()->setAttribute(program);
>       ////////////////////////////////////////
> 
>       osg::ref_ptr<osg::StateSet> ss = SAQgeometry->getStateSet();
> ...
> }
> 
> 
> 
> Just to ensure there's nothing wrong with my OSG code, I commented out
> the geometry shader-related code and had the frag shader color the
> primitive yellow and it worked perfectly.
> 
> Anyway, I've looked for answers and I'm finding geometry shader
> information, esp. as it relates to OSG is (not surprisingly) somewhat
> sparse.
> 
> I appreciate any thoughts / comments / tips that anyone may have.
> 
> Thanks.
> 
> Joel
> 
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=34101#34101
> 
> 
> 
> 
> 
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to