如何使用glsl改变顶点位置
How to change vertex position using 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;
}
但是当相机的垂直位置小于300或大于1000时,模型就会消失,而在第二种情况下,它应该只移动一个单位。我读到关于内部的着色器坐标与世界坐标不同,这就是为什么我乘以投影和ModelView矩阵,以获得世界坐标。也许我在这一点上是错的?如果这是一个简单的问题,请原谅我,但我找不到答案。
UPDATE: 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;
}
gl_Position
在clip-space中,您为任何坐标输出的值必须>= - gl_Position.W
或<= gl_Position.W
,否则它们将被剪切。如果一个原语的所有坐标都在这个范围之外,那么将不会绘制任何内容。这样做的原因是,在顶点着色器完成后,OpenGL将clip-space坐标除以W
,生成范围为[-1,1](NDC)的坐标。
你在这里应该做的是将这些坐标添加到你的对象空间位置,然后执行从对象空间到剪辑空间的转换。三十二上校的回答已经很好地说明了如何做到这一点;我只是想解释为什么你不应该把这个偏移量应用到clip-space坐标
figure out:
uniform mat4 osg_ViewMatrixInverse;
uniform mat4 osg_ViewMatrix;
void main(){
vec3 camPos=osg_ViewMatrixInverse[3].xyz;
vec4 position_in_view_space = gl_ModelViewMatrix * gl_Vertex;
vec4 position_in_world_space = osg_ViewMatrixInverse * position_in_view_space;
if( camPos.z >1000.0 )
position_in_world_space.z = position_in_world_space.z+700.0;
if( camPos.z >5000.0 )
position_in_world_space.z = position_in_world_space.z+1000.0;
if (camPos.z< 300.0 )
position_in_world_space.z = position_in_world_space.z+200;
position_in_view_space = osg_ViewMatrix * position_in_world_space;
vec4 position_in_object_space = gl_ModelViewMatrixInverse * position_in_view_space;
gl_Position = gl_ModelViewProjectionMatrix * position_in_object_space;
}
一个人需要将gl_Vertex(在对象空间坐标中)通过视图空间坐标转换为世界坐标(也许有直接转换我没有看到),然后他可以修改它们并转换回对象空间坐标
- 如何循环打印顶点结构
- 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 进行调试时有效
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- OpenGL ES:在顶点着色器中计算顶点位置时性能不佳
- 无法在顶点着色器中设置输入的位置
- 我可以将单个顶点索引与具有所有属性(位置、法线、texCoord)的顶点缓冲区一起使用吗?
- 给定一个用三角形镶嵌的补丁,如何修改其新的顶点位置
- 了解 glm::ortho() 的参数如何影响投影后的顶点位置
- 顶点属性 - 对顶点位置使用短点而不是浮点数
- 如何将顶点位置传递给顶点着色器.我写了一个着色器,它不会在屏幕上绘制任何内容
- 顶点着色器中的位置矢量与glLate冲突
- C++opengl在glTranslatef之后获得新的顶点位置
- 对象模型加载纹理坐标和顶点位置没有正确加载
- OpenGL以像素为单位定义顶点位置
- 带有骨骼的Assimp + COLLADA模型=不正确的顶点位置
- OpenGL如何知道它应该基于GL_ARRAY_BUFFER绘制顶点到什么位置
- GLSL-调用的顶点和片段的时间和位置
- 我如何从wavefront .obj文件中获得索引顶点位置和索引顶点法线到OpenGL顶点着色器
- 如何使用glsl改变顶点位置
- OpenGl的错误.运行时立方体顶点位置错误