Str*_*399 2 c++ opengl glsl openscenegraph
我试图根据相机位置移动对象。这是我的顶点着色器
uniform mat4 osg_ViewMatrixInverse;
void main(){
vec4 position = gl_ProjectionMatrix * gl_ModelViewMatrix *gl_Vertex;
vec3 camPos=osg_ViewMatrixInverse[3].xyz;
if( camPos.z >1000.0 )
position.z = position.z+1.0;
if( camPos.z >5000.0 )
position.z = position.z+10.0;
if (camPos.z< 300.0 )
position.z = position.z+300.0;
gl_Position = position;
}
Run Code Online (Sandbox Code Playgroud)
但是,当摄像机的垂直位置小于300或大于1000时,该模型只是消失了,尽管在第二种情况下,它应该仅移动一个单位。我了解到着色器内部的坐标不同于世界坐标,这就是为什么我要乘以Projection和ModelView矩阵来获得世界坐标。在这一点上也许我错了?如果这是一个简单的问题,请原谅我,但我找不到答案。
更新:camPos转换为世界坐标,但位置未转换。可能与我使用osg_ViewMatrixInverse(由OpenSceneGraph传递)来获取相机位置以及内部gl_ProjectionMatrix和gl_ModelViewMatrix来获取顶点坐标有关。如何将位置转换为世界坐标?
问题在于,您正在将位置转换为片段坐标(通过乘以gl_Vertex投影和模型视图矩阵),然后对这些片段坐标执行世界坐标操作,而无法获得所需的结果。
在乘以模型视图和投影矩阵之前,只需执行转换即可。
uniform mat4 osg_ViewMatrixInverse;
void main() {
vec4 position = gl_Vertex;
vec3 camPos=osg_ViewMatrixInverse[3].xyz;
if( camPos.z >1000.0 )
position.z = position.z+1.0;
if( camPos.z >5000.0 )
position.z = position.z+10.0;
if (camPos.z< 300.0 )
position.z = position.z+300.0;
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * position;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5898 次 |
| 最近记录: |