2016-05-29 9 views
0

インスタンス化エフェクトを作成しようとしています。私は通常の長方形のテクスチャシェーダを取り、属性に追加しました。ところで私のゲームは2.0頂点シェーダで回転するときの奇妙な効果

  1. その第一、第二又は第三等の場合はアンIDは、オフセット位置
  2. それを伝えるために(だから彼らは、画面を動き回ることができます)2DおよびOpenGL ESのある
  3. 時間

IDに基づいて、矩形のTimeとインスタンスIDに基づいてローテーションをアニメートします。私はCPUのオーバーヘッドがかなり高いので、GPUでこれを行う必要があります。

角度に基づいて回転行列を作成すると主張しているglsl関数が見つかりましたが、本当にワープされた効果が得られます。私が行列で行う必要があるのは、矩形の点(0.5、0.0)(底の中央)について2次元スクリーン上のある角度だけ回転させることです。

しかし、この新しい回転関数は意図したとおりに機能しません。座標は奇妙な位置にあり、アンカーポイントが0.5,0.0でないことは確かです。

旧バージョン(これは左下隅に描かれていて、単なる長方形です)(注:新しいバージョンのposまたはtc情報は変更されていません。回転させるだけです)

precision highp float; 

attribute vec2 pos; 
attribute vec2 tc; 
attribute float instance; 

uniform mat4 matrix; 
uniform float time; 
uniform vec2 position; 

varying vec2 v_texcoord; 

void main() 
{ 
    gl_Position = matrix/* * rotationMatrix(vec3(1.0), 3.14 * instance)*/ * vec4(pos, 1.0, 1.0); 
    v_texcoord = tc; 
} 

新バージョン(それに回転して位置を追加しました)

precision highp float; 

attribute vec2 pos; 
attribute vec2 tc; 
attribute float instance; 

uniform mat4 matrix; 
uniform float time; 
uniform vec2 position; 

varying vec2 v_texcoord; 

mat4 rotationMatrix(vec3 axis, float angle) 
{ 
    axis = normalize(axis); 
    float s = sin(angle); 
    float c = cos(angle); 
    float oc = 1.0 - c; 

    return mat4(oc * axis.x * axis.x + c,   oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, 
       oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c,   oc * axis.y * axis.z - axis.x * s, 0.0, 
       oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c,   0.0, 
       0.0,        0.0,        0.0,        1.0); 
} 
void main() 
{ 
    gl_Position = matrix * rotationMatrix(vec3(1.0), 3.14 * instance) * vec4(pos + position, 1.0, 1.0); 
    v_texcoord = tc; 
} 

任意のアイデアなぜですか?

答えて

0

回転行列を作成するための式で、軸を定義するベクトルは単位ベクトルである必要があります。つまり、長さが1である必要があります。これはあなたの例では当てはまりません。 vec3(1.0)と書くと、長さがsqrt(3.0)vec3(1.0, 1.0, 1.0)に相当します。

normalize(vec3(1.0)) 

または直接単位長ベクトルとしてそれを書く:

簡単な修正は、ベクトルを正規化することであるあなただけ回転させたいようなあなたの記述から

vec3(1.0/sqrt(3.0)) 

、それは実際に聞こえます座標軸の1つを中心に回転軸として(1.0, 1.0, 1.0)を使用する理由は明確ではありません。

たとえば、ポイントposangleでZ軸回りに回転するには、行列を作成することに気をつけません。ローテーションを直接次のように記述してください:

float c = cos(angle); 
float s = sin(angle); 
gl_Position = vec4(c * pos.x - s * pos.y, s * pos.x + c * pos.y, pos.zw); 
関連する問題