查看: 3498|回复: 23

着色器加到场景中模型变黑了

[复制链接]

该用户从未签到

发表于 2012-10-28 23:12:20 | 显示全部楼层 |阅读模式
我把着色器放在场景中,开启场景灯光,但是模型还是全黑的呀,怎么办,能把着色器里的设的条件达到了呢?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的颜色。


问题截图.jpg 代码截图.jpg
期盼各位大师指点。
   

该用户从未签到

发表于 2012-10-30 10:33:40 | 显示全部楼层
一个最简单的推测就是您的LightPosition和end都是人眼坐标系下的值,因此在世界坐标系下它们是随着视点运动的,我想您应该更仔细地推敲一下自己的算法,而这并不是我们可以代劳的

该用户从未签到

发表于 2012-10-29 08:55:11 | 显示全部楼层
光凭两个着色器的话,还是看不出来的,这样吧,你把所有的Uniform变量的初始值给出来,否则没法调试的。

该用户从未签到

 楼主| 发表于 2012-10-29 09:06:27 | 显示全部楼层
the_mercury 发表于 2012-10-29 08:55
光凭两个着色器的话,还是看不出来的,这样吧,你把所有的Uniform变量的初始值给出来,否则没法调试的。

哎呀,终于有人回复了,谢谢,谢谢
代码截图.jpg

该用户从未签到

发表于 2012-10-29 09:11:44 | 显示全部楼层
cos 用的是 弧度值  不知道是不是这里的错误

该用户从未签到

 楼主| 发表于 2012-10-29 09:18:07 | 显示全部楼层
liuzhiyu123 发表于 2012-10-29 09:11
cos 用的是 弧度值  不知道是不是这里的错误

换成弧度制,还是黑的呀

该用户从未签到

发表于 2012-10-29 09:54:56 | 显示全部楼层
你看看你自己写的着色器,错误百出,自己下去好好看看OpenGL着色语言这本书吧。
着色器对象压根就没有能够编译通过,先调试通过了再说吧

该用户从未签到

 楼主| 发表于 2012-10-29 09:57:29 | 显示全部楼层
the_mercury 发表于 2012-10-29 09:54
你看看你自己写的着色器,错误百出,自己下去好好看看OpenGL着色语言这本书吧。
着色器对象压根就没有能够 ...

我的dos界面没有错误啊,我是在看着色语言啊,不然给你贴个全的代码,你试试?

该用户从未签到

发表于 2012-10-29 09:57:51 | 显示全部楼层
先在OpenGL下面将着色器调试通过,再拿到OSG上面来,你这种错误,真是把别人累死。。。

该用户从未签到

 楼主| 发表于 2012-10-29 09:59:01 | 显示全部楼层
the_mercury 发表于 2012-10-29 09:54
你看看你自己写的着色器,错误百出,自己下去好好看看OpenGL着色语言这本书吧。
着色器对象压根就没有能够 ...

再说了,如果着色器有错误编译不通过,那个lz.osg地形会正常渲染的,就是不会变黑

该用户从未签到

发表于 2012-10-29 10:14:49 | 显示全部楼层
1.float distance (genType p0, genType p1) Returns the distance between p0 and p1, i.e.
length (p0 – p1)
2.The varying qualifier can be used only with float, floating-point vectors, matrices, or arrays of these.

该用户从未签到

发表于 2012-10-29 10:15:53 | 显示全部楼层
你看看你写的
varying bool distance;
还死争没有错误呢

该用户从未签到

 楼主| 发表于 2012-10-29 10:18:23 | 显示全部楼层
the_mercury 发表于 2012-10-29 10:14
1.float distance (genType p0, genType p1) Returns the distance between p0 and p1, i.e.
length (p0 – ...

"        float dis=length(ecPosition-LightPosition);\n"这个不对么?我的distance是bool形的,dis是计算距离的呀

该用户从未签到

 楼主| 发表于 2012-10-29 10:24:48 | 显示全部楼层
the_mercury 发表于 2012-10-29 10:15
你看看你写的
varying bool distance;
还死争没有错误呢

不是有bool型变量吗?那个bool型变量是判断距离是否在可达到范围的呀,我说话总是说不清,上图: lake.jpg

该用户从未签到

发表于 2012-10-29 12:09:52 | 显示全部楼层
片元着色器的 if 条件语句一直为false,导致gl_FragColor没有被赋值,可以添加一个else测试:
  1.         static const char* fragSource={
  2.                 "varying bool distance;\n"
  3.                 "varying float yuXian;\n"
  4.                 "varying float dirNormal;\n"
  5.                 "uniform float angle;\n"
  6.                 "uniform vec4 color;\n"

  7.                 "void main()\n"
  8.                 "{\n"
  9.                 "        float spotDot = cos(0.5*angle);\n"
  10.                 "        if(yuXian<spotDot && distance && dirNormal>=0)\n"
  11.                 "                gl_FragColor = color;\n"
  12.                 "        else\n"
  13.                 "                gl_FragColor = vec4(1.0,1.0,0.0,1.0);\n"
  14.                 "}\n"
  15.         };
复制代码

该用户从未签到

 楼主| 发表于 2012-10-29 12:15:07 | 显示全部楼层
woshijiameizhou 发表于 2012-10-29 12:09
片元着色器的 if 条件语句一直为false,导致gl_FragColor没有被赋值,可以添加一个else测试:

你真伟大,模型亮了,确实是可以得到颜色的,可是颜色是我在else里设置的颜色,那模型本身的纹理和贴图就不见了。怎么样能保持原样呢?

该用户从未签到

发表于 2012-10-29 12:16:05 | 显示全部楼层
看你的代码意图好像是要实现一个 锥形光的样子。

该用户从未签到

 楼主| 发表于 2012-10-29 12:32:02 | 显示全部楼层
woshijiameizhou 发表于 2012-10-29 12:16
看你的代码意图好像是要实现一个 锥形光的样子。

对,你真聪明,就是这个意思

该用户从未签到

发表于 2012-10-29 12:50:11 | 显示全部楼层
呵呵,刚把楼主的代码看了,可能有几个问题(个人理解,呵呵):
1> 加载的这个地形文件“lz.osg”,它的顶点的z值都比较大,所以你的那个LightPosition的z值要设置的比较大,可能要在300左右,灯光才能在地形上面。
2>因为光会投影在XOY平面,所以判断distance只需要判断顶点的(x,y)二维分量和lightPosition的x,y二维分量的距离。判断是否照亮。
3>光锥的angle不能太大,否则经过远距离传输,投影到地面会形成很大的区域。
4>余弦函数在第一象限是单调递减。

该用户从未签到

发表于 2012-10-29 13:00:42 | 显示全部楼层
Berly 发表于 2012-10-29 12:32
对,你真聪明,就是这个意思

实现光斑我看大家好像都是用一个 光斑图片作为遮罩,用遮罩上的rgb值和纹理原有的rgb值线性组合得到一个新的fragColor,这样的光斑高效,美观。按照楼主的构思,那个光斑边缘很硬,估计不好看。

该用户从未签到

 楼主| 发表于 2012-10-29 13:19:20 | 显示全部楼层
woshijiameizhou 发表于 2012-10-29 12:50
呵呵,刚把楼主的代码看了,可能有几个问题(个人理解,呵呵):
1> 加载的这个地形文件“lz.osg”,它的顶 ...

我很感谢你的回复,这个着色器是为了判断模型上的各个顶点是否在锥形内,虽然没有灯光,但是希望达到的效果,就是在锥形内部的模型背面的所有的片元都被换成红色,相当于光照的阴影部分换成红色

该用户从未签到

发表于 2012-10-29 17:09:03 | 显示全部楼层
你再仔细读下十楼的和十一楼的两个贴子呀,那么点英文看不懂吗?
十楼的第一条说的是什么:distance是GLSL的内置函数,不能用作变量!
第二条说的是什么:varying限定符只能限定浮点类型,浮点向量,浮点矩阵和浮点数组。
你写的varying bool distance;一句话犯两个错,还看不出来吗?看别人发的帖子也不认真。

该用户从未签到

 楼主| 发表于 2012-10-29 17:55:46 | 显示全部楼层
the_mercury 发表于 2012-10-29 17:09
你再仔细读下十楼的和十一楼的两个贴子呀,那么点英文看不懂吗?
十楼的第一条说的是什么:distance是GLSL的 ...

那个地方我看懂了,我已经改了,效果一样,不是我不认真,       
         "varying bool tance;\n"
        "varying float yuXian ;\n"
        "varying float dirNormal;\n"
        "uniform float angle;\n"
        "uniform vec4 color;\n" 看了人家的回复,我改了一些, 出现了一些效果,但是还是不对

该用户从未签到

 楼主| 发表于 2012-10-29 21:48:31 | 显示全部楼层
木有人回复了呀,因为bool型存在21楼说的争议,改成"varying float tance;\n"
判断距离的代码改成       
          " if(dis<=length(end-LightPosition))\n"
        " tance=1.0;\n"
        " else\n"
        " tance=0.0;\n"

片元着色器的判断条件写成:"if(dirNormal>=0&&yuXian<=spotDot &&tance)\n",全部不满足,直接执行else语句"gl_FragColor=vec4(0.0f,1.0f,0.0f,1.0f);\n"模型整体变成绿色,随左键移动模型改变着色范围;
判断条件::"if(dirNormal>=0&&yuXian<=spotDot &&tance)\n“,显示不正确的着色。
terrian.jpg

说明:黑色的点是起点,白色是终点(可能图上看不到),两点间的距离4.38748
问题一:距离的判断怎么全部不满足?难道距离不是在同一个坐标系下的?
问题二:当点击左键移动鼠标的时候,分开着色的红色和绿色的范围会随时改变,不知道为什么?
问题三:怎样使满足条件的片元着色,不满足的保持原来的纹理呢?(确定模型有纹理,可以显示)


谢谢各位了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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