インスタンス化エフェクトを作成しようとしています。私は通常の長方形のテクスチャシェーダを取り、属性に追加しました。ところで私のゲームは2.0頂点シェーダで回転するときの奇妙な効果
- その第一、第二又は第三等の場合はアンIDは、オフセット位置
- それを伝えるために(だから彼らは、画面を動き回ることができます)2DおよびOpenGL ESのある
- 時間
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;
}
任意のアイデアなぜですか?