簡體   English   中英

如何使用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時,模型會消失,但在第二種情況下它應該只移動一個單位。 我讀到有關着色器坐標內部不同於世界坐標,這就是為什么我乘以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM