查看: 820|回复: 0

OpenGL 在glUseProgram后报错 GL_INVALID_OPERATION

[复制链接]

该用户从未签到

发表于 2017-10-12 14:19:11 | 显示全部楼层 |阅读模式
本帖最后由 the_mercury 于 2017-10-12 14:26 编辑

请大家帮忙看一下我下面的这个代码错在哪里:

程序中使用了OpenGL Shader
  1. // vertex shader
  2. #version 130
  3. in vec4 osg_Vertex;
  4. in vec4 osg_Color;
  5. out vec4 color;
  6. uniform mat4 osg_ModelViewProjectionMatrix;
  7. uniform float pointSize;
  8. void main(void)
  9. {
  10.     color = osg_Color;
  11.     gl_PointSize = pointSize;
  12.     gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex;
  13. }

  14. // fragment shader
  15. #version 130
  16. in vec4 color;
  17. out vec4 fragColor;
  18. void main(void)
  19. {
  20.     fragColor = color;
  21. }
复制代码


下面是osg的C++代码
  1. osg::ref_ptr<osg::Shader> vertexShader = new osg::Shader(osg::Shader::VERTEX, vertex_shader_code);
  2. osg::ref_ptr<osg::Shader> fragmentShader = new osg::Shader(osg::Shader::FRAGMENT, fragment_shader_code);
  3. osg::ref_ptr<osg::Program> program = new osg::Program();
  4. program->addShader(vertexShader);
  5. program->addShader(fragmentShader);
  6. program->addBindFragDataLocation("fragColor", 0);
  7. stateSet->setAttributeAndModes(program, osg::StateAttribute::ON);
  8. stateSet->setMode(GL_PROGRAM_POINT_SIZE_EXT, osg::StateAttribute::ON);
  9. osg::ref_ptr<osg::Uniform> pointSize = new osg::Uniform("pointSize", 5.0);
  10. stateSet->addUniform(pointSize);
复制代码
这个时候osg在执行到glUseProgram的时候报错GL_INVALID_OPERATION,当程序作改动之后,程序就正常了

改动后的Shader如下
  1. // vertex shader
  2. #version 130
  3. in vec4 osg_Vertex;
  4. in vec4 osg_Color;
  5. out vec4 color;
  6. uniform mat4 osg_ModelViewProjectionMatrix;
  7. void main(void)
  8. {
  9.     color = osg_Color;
  10.     gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex;
  11. }

  12. // fragment shader
  13. #version 130
  14. in vec4 color;
  15. out vec4 fragColor;
  16. void main(void)
  17. {
  18.     fragColor = color;
  19. }
复制代码

并且在程序中去掉以下行:
  1. stateSet->setMode(GL_PROGRAM_POINT_SIZE_EXT, osg::StateAttribute::ON);
  2. osg::ref_ptr<osg::Uniform> pointSizeUniform = new osg::Uniform("pointSize", 5.0);
  3. stateSet->addUniform(pointSizeUniform);
复制代码

显卡型号为NVIDIA GeForce GT720/PCIe/SSE2 OpenGL和GLSL版本分别为4.5


请问如何在程序中设置gl_PointSize内置变量啊,为什么我的就是不对呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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