2014-02-21 91 views
4

我目前在3D世界中繪製了一個平面(三角形條)。我現在想把它畫成廣告牌 - 所以臉部與相機對齊。如何實現廣告牌?

這是代碼:

#version 330 core 

layout(points) in; 
layout(triangle_strip, max_vertices=4) out; 
out vec2 tex_coord; 

uniform mat4x4 model; 
uniform mat4x4 view; 
uniform mat4x4 projection; 

uniform float size = 1.0; 

// texture coordinates 
const vec2 texc[4] = vec2[] (vec2(0, 0), 
          vec2(0, 1), 
          vec2(1, 0), 
          vec2(1, 1)); 

void main() { 
    // vertex offsets from the center point 
    float asize = size/2; 
    vec4 offset[4] = vec4[] (vec4(-asize, 0.0, -asize, 0.0), 
          vec4(-asize, 0.0, asize, 0.0), 
          vec4(asize, 0.0, -asize, 0.0), 
          vec4(asize, 0.0, asize, 0.0)); 
    int i, j; 
    for(i = 0; i < gl_in.length(); ++i) { 
     for(j = 0; j < 4; ++j) { 

      // vector coordinates 
      vec4 vertexpos = (gl_in[i].gl_Position + offset[j]); 
      vec4 position = projection * view * model * vertexpos; 
      gl_Position = position; 

      tex_coord = texc[j]; 
      EmitVertex(); 
     } 
     EndPrimitive(); 
    } 
} 

顯然輸出僅僅是一個平面:

enter image description here

必須如何代碼進行更改繪製平面廣告牌?我知道我必須使用視圖矩陣來計算頂點座標(在內部循環中),但我無法弄清楚如何。

回答

3

添加offset後,你的項目gl_in[i].gl_Position

int i, j; 
for(i = 0; i < gl_in.length(); ++i) 
{ 
    vec4 centerpt = projection * view * model * gl_in[i].gl_Position; 
    for(j = 0; j < 4; ++j) 
    { 
     gl_Position = centerpt + offset[j]; 
     tex_coord = texc[j]; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 
+1

這使得有很大的意義,感謝您的回答。有一點要說,'投影'仍然必須應用在內部循環中,否則精靈將會被拉伸。 – Appleshell

+0

您還可以解釋一個實現看起來像只有一個軸是相機對齊的嗎?比如說精靈只沿y軸「旋轉」。 – Appleshell

+0

@AdamS:不知道,對不起。 – genpfault