1

cocos2d 2.0 を使用して BatchNode にシェーダーを適用しています。

新しいユニフォームを保持するように ccV3F_C4B_T2F 構造体を更新したので、次のようになりました。

typedef構造体_ccV3F_C4B_T2F {

ccVertex3F      vertices;           

ccColor4B       colors;         

ccTex2F         texCoords;      

    ccVertex2F              NewCoords;     

} ccV3F_C4B_T2F;

CCspritebatchnode の plist に新しいプロパティ値を追加しました。これは、シェーダーに渡したい値です。したがって、バッチノードが各フレームのオフセット、カラー長方形などを取得するとき。また、通過する必要がある値も取得します。それは働いた。

次に、Batchnodes plist から値を取得し、「updatetransform」を変更して値を受け取りました。したがって、次のようになります。

 quad_.bl.NewCoords = (ccVertex2F) { newCoords.x, newCoords.y };
        quad_.br.NewCoords = (ccVertex2F) { newCoords.x, newCoords.y };
        quad_.tl.NewCoords = (ccVertex2F) { newCoords.x, newCoords.y };
        quad_.tr.NewCoords = (ccVertex2F) { newCoords.x, newCoords.y };

CCSpriteBatchNode をサブクラス化し、シェーダーを適用しました。

頂点シェーダー:

\n\
attribute vec4 a_position;                          \n\
attribute vec2 a_texCoord;                          \n\
attribute vec4 a_color;                             \n\
attribute vec2 a_newcoords;                          \n\
\n\
varying lowp vec4 v_fragmentColor;                  \n\
varying mediump vec2 v_texCoord;                    \n\
varying mediump vec2 v_newcoords;                   \n\
\n\
void main()                                         \n\
{                                                   \n\
   gl_Position = CC_MVPMatrix * a_position;     \n\
   v_fragmentColor = a_color;                       \n\
   v_texCoord = a_texCoord;                     \n\
   v_newcoords = a_newcoords;                        \n\
 }                                                      \n\
";

フラグメント シェーダー:

#ifdef GL_ES
precision highp float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
varying vec2 v_newcoords;

 uniform sampler2D u_texture;

void main()
{
     vec2 texCoord = v_texCoord;
     vec4 texColor  = texture2D(u_texture, texCoord);

     vec2 MoveBy = vec2(v_newcoords.x, v_newcoords.y);
     vec4 Color1  = texture2D(u_texture, vec2(v_texCoord.x - MoveBy.x , v_texCoord.y));

     vec4 finalColor = vec4(texColor.r, texColor.g, Color1.b, texColor.a);
     gl_FragColor =  finalColor;
 }

頂点シェーダーは「属性 vec2 a_newcoords;」を取得します。正しいですが、フラグメントシェーダーから「v_newcoords の可変」にアクセスできません。

誰かが私が間違っているかもしれないことを知っていますか??

4

0 に答える 0