2016-06-28 4 views
-1

現在、2DアプリケーションのゲームエンジンをC++で作成しています。しかし、現時点では、頂点シェーダでスプライトを回転させることに悩まされています。私はちょっとthis 説明に従った。私はGLMを使いたくないので、自分でいくつかのことを書く必要があります。 現時点では、これは私のテクスチャシェーダです。GLSL 2D Rotation Matrixが期待どおりに動作しない

バーテックスシェーダ

out vec2 fragPos; 
out vec2 fragUV; 

uniform vec2 pos; 
uniform vec2 size; 
uniform float rotation; 

void main(){ 
//gl_Position is OpenGL defined 
gl_Position.z = 0.0; 
gl_Position.w = 1.0; 
gl_Position.x = vertPos.x + pos.x*2 - 1; 
gl_Position.y = vertPos.y + pos.y*2 - 1; 

mat4 rotationMat = mat4(cos(rotation), sin(rotation) * -1, 0, 0, 
         sin(rotation), cos(rotation), 0, 0, 
         0, 0, 1, 0, 
         0, 0, 0, 1); 


gl_Position *= rotationMat; 

//vec2 size 
if(size.x != 0 || size.y != 0){ 
    if(gl_VertexID != 0){ 
     switch(gl_VertexID){ 
      case 1: gl_Position.x += size.x; break; 
      case 2: gl_Position.y += size.y; break; 
      case 3: gl_Position.y += size.y; break; 
      case 4: gl_Position.x += size.x; gl_Position.y += size.y; break; 
      case 5: gl_Position.x += size.x; break; 
     } 
    } 
} 


fragPos = vertPos; 
fragUV = vec2(vertUV.x, 1.0 - vertUV.y); 
} 

どんなに値Iが通過、回転は変更されません。スプライトの位置のみ。 Hereはどのように見えますか?テクスチャはすごく盛り上がっているはずです。私もthisの質問にチェックしましたが、それはまったく助けませんでした。 私は自分のテクスチャが回転したくない理由を知っています。

+0

有効なシェーダーを投稿していません。宣言されていない変数を使用します( 'rotateZ')。 [mcve]を提供してください。 –

+0

おっと、恥ずかしいです。私はさまざまな方法を試してみました。使用されていないすべてのコードからコードを消去したとき、私は何かを混乱させました。私はそれが機能するようにそれを編集しました。 – Kiryu144

答えて

2

どの値を渡しても、回転は変化しません。スプライトの位置のみ。

これはまさにあなたのコードがすることです。スプライトの1つのコーナーポイント(プリミティブのすべての頂点で同じです)を計算し、回転を適用してから、頂点IDに応じてx/yのオフセットを追加して軸に合わせた矩形を作成します。全体を回転させたい場合は、実際の矩形の角を計算した後に回転を適用する必要があります。

+0

私の神。ありがとう、今それは正常に動作します! – Kiryu144

関連する問題