[英]Using vertex buffer instancing, how to dynamically change separate instance position?
[英]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時,模型會消失,但在第二種情況下它應該只移動一個單位。 我讀到有關着色器坐標內部不同於世界坐標,這就是為什么我乘以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;
}
gl_Position
位於剪輯空間中,您為任何坐標輸出的值必須> = - gl_Position.W
或<= gl_Position.W
否則它們將被剪裁。 如果基元的所有坐標都在此范圍之外,則不會繪制任何內容。 這樣做的原因是在頂點着色器完成后,OpenGL將剪輯空間坐標除以W
以產生范圍[-1,1](NDC)中的坐標。 此卷外的任何內容都不會出現在屏幕上。
你應該在這里做的是將這些坐標添加到對象空間位置,然后執行從對象空間到剪輯空間的轉換。 三十二上校的答案已經很好地展示了如何做到這一點; 我只想解釋為什么不應該將此偏移應用於剪輯空間坐標。
弄清楚了:
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(在對象空間坐標中)轉換為通過視圖空間坐標(可能有直接轉換,我看不到)的世界坐標,而不是修改它們並轉換回對象空間坐標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.