小编Str*_*399的帖子

如何使用glsl更改顶点位置

我试图根据相机位置移动对象。这是我的顶点着色器

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来获取顶点坐标有关。如何将位置转换为世界坐标?

c++ opengl glsl openscenegraph

2
推荐指数
1
解决办法
5898
查看次数

标签 统计

c++ ×1

glsl ×1

opengl ×1

openscenegraph ×1