查看: 1253|回复: 4

请教一个关于 osgVertexShader 动态控制gl_Position的问题

[复制链接]

该用户从未签到

发表于 2013-9-26 17:38:09 | 显示全部楼层 |阅读模式
请教大家一个关于顶点着色器的问题:

小弟最近有一个项目需要同时渲染海量的长方形,它们都有自己的坐标 以及长宽高,出于效率考虑我想用shader解决
同时渲染没有问题 但是卡在传入他们自己的坐标值上了
最后决定用texture(texture的每一个像素点都保存了它们的坐标以及长宽)传坐标值 代码如下
const char* vertCode = {
        "uniform sampler2D defaultTex;\n"
        "vec4  centerPos;\n"
        "vec4  scale;\n"
        "void main()\n"
        "{\n"
        "    float r = float(gl_InstanceID*2) / 32.0;\n"              //texture size 32*32
        "    vec2 uv = vec2(fract(r), floor(r) / 32.0);\n"       //获得纹理坐标
        "    centerPos = texture2D(defaultTex, uv);\n"       //读取纹理信息 当做此图形的位置点
       
        "    r = float(gl_InstanceID*2 +1) / 32.0;\n"
        "    uv = vec2(fract(r), floor(r) / 32.0);\n"
        "    scale = texture2D(defaultTex, uv);\n"                //读取纹理信息 当做此图形长宽点


        //"   gl_Vertex = centerPos ;\n"
        "    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
        "}\n"

这样 图形根本就不会显示 ,可我感觉也没有什么错了 ,特此求助于给位领导!!感谢感谢

gemo添加图元的unfiom变量使用如下方法,geom就是一个六面体 setVetex and setQUADS

ps:
texture->setImage( image );
        texture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D:INEAR );
        texture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
        geom->getOrCreateStateSet()->setTextureAttributeAndModes( 0, texture.get() );
        geom->getOrCreateStateSet()->addUniform( new osg::Uniform("defaultTex", 0) );

该用户从未签到

发表于 2013-9-27 11:28:53 | 显示全部楼层
texture2D  范围映射到 0~1 了

该用户从未签到

发表于 2013-9-27 11:31:14 | 显示全部楼层
考虑使用float texture

该用户从未签到

 楼主| 发表于 2013-9-28 19:25:39 | 显示全部楼层
liuzhiyu123 发表于 2013-9-27 11:31
考虑使用float texture

我还想问一下 正常传入的texture是否都应该是 32位 的位图呢?

我找到以下代码

osg::Texture* texture = new osg::Texture2D;
osg::Image* image = new osg::Image();
image->allocateImage(size, size, 1, GL_LUMINANCE, GL_FLOAT);
texture->setInternalFormat(GL_LUMINANCE32F_ARB);
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture:INEAR);
texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
texture->setImage(image);

image->allocateImage(size, size, 1, GL_LUMINANCE, GL_FLOAT);这句是否就是让 texture为floatl类型?用GL_FLOAT 这个参数
以上生成的image我通过 witeImageFile  看到其位深度都是24  这样的纹理 传到 vertexshader 中会有问题吗?

多谢 liuzhiyu123 !!!

该用户从未签到

发表于 2013-10-9 09:17:06 | 显示全部楼层
不会有问题,不过vertex shader对texture的支持并不是一开始就有的,请注意这一点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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