0

ゲーム開発に関しては全くの初心者です。Cocos2D を使って最初の一歩を踏み出しましたが、理解できない奇妙な問題があります。

スクロールする背景の動的なテクスチャを作成するために、CCRenderTexture を作成しようとしています。現時点では、黄色の背景に黒い縞模様のみをレンダリングする必要があります。

だから私はそれを達成するために次のように書いた:

- (CCSprite *)debugTextureWidth:(float)textureWidth textureHeight:(float)textureHeight {

  // Create a texture and set the background color to yellow
  CCRenderTexture *debugTexture = [CCRenderTexture renderTextureWithWidth:textureWidth height:textureHeight];
  [debugTexture beginWithClear:1.0f g:204.0f /255.0f b:0 a:1.0f];

  // ccDrawLine(ccp(0, 0), ccp(200.0f, 200.0f));

  // Draw some diagonal stripes
  int nStripes = ((arc4random() %4) +1) *2;
  CGPoint vertices[nStripes *6];
  ccColor4F colors[nStripes *6];

  int nVertices = 0;
  float x1 = -textureHeight;
  float x2;
  float y1 = textureHeight;
  float y2 = 0;
  float dx = textureWidth /nStripes *2;
  float stripeWidth = dx /2;

  ccColor4F stripeColor = (ccColor4F){1.0f, 0, 0, 1.0f};

  for (int i = 0; i < nStripes; i++) {
    x2 = x1 + textureHeight;

    vertices[nVertices] = CGPointMake(x1, y1);
    colors[nVertices++] = stripeColor;

    vertices[nVertices] = CGPointMake(x1 +stripeWidth, y1);
    colors[nVertices++] = stripeColor;

    vertices[nVertices] = CGPointMake(x2, y2);
    colors[nVertices++] = stripeColor;

    vertices[nVertices] = vertices[nVertices -2];
    colors[nVertices++] = stripeColor;

    vertices[nVertices] = vertices[nVertices -2];
    colors[nVertices++] = stripeColor;

    vertices[nVertices] = CGPointMake(x2 +stripeWidth, y2);
    colors[nVertices++] = stripeColor;
    x1 += dx;
  }

  [self setShaderProgram:[[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionColor]];

  glEnableVertexAttribArray(kCCVertexAttribFlag_Color);
  glEnableVertexAttribArray(kCCVertexAttrib_Color);

  [self.shaderProgram use];
  [self.shaderProgram setUniformsForBuiltins];

  // CC_NODE_DRAW_SETUP();

  glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
  glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_FLOAT, GL_TRUE, 0, colors);
  glDrawArrays(GL_TRIANGLES, 0, (GLsizei)nVertices);

  [debugTexture end];

  return [CCSprite spriteWithTexture:debugTexture.sprite.texture];
}

これは私に次のようなものを与えます:

CCRenderTexture の失敗

今、奇妙な部分が来ます。6 行目の ccDrawLine 命令のコメントを外すとすぐに、次のようになります。

CCRenderTexture 半勝

これで、最初に欲しかった線とストライプが描画されます。

これを理解するために数時間検索しましたが、検索で得たのは「シェーダーを追加する必要があります」のようなものだけでした。

私が言ったように、私はこの OpenGL 全体にまったく慣れていません。ここでしばらくお待ちください。:-) 私は本当にこれを理解したいです。したがって、私の問題の解決策や、このトピックに関する適切な読み物を探すための適切な指針がある場合は、お知らせください。

ありがとう、トーマス

4

1 に答える 1

0

問題が見つかりました。単純なタイプミスでした。

コード自体に問題はありません。しかし、シェーダーをセットアップするために間違った呼び出しを使用しただけです。

この部分は間違っています:

glEnableVertexAttribArray(kCCVertexAttribFlag_Color);
glEnableVertexAttribArray(kCCVertexAttrib_Color);

[self.shaderProgram use];
[self.shaderProgram setUniformsForBuiltins];

// CC_NODE_DRAW_SETUP();

まず第一に、間違ったパラメーターで間違ったメソッドを呼び出します。ここでオートコンプリートにだまされたと思います。正しい呼び出しは次のようになります。

ccGLEnableVertexAttribs(kCCVertexAttribFlag_Color);
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);

CC_NODE_DRAW_SETUP();

コードの残りの部分は同じままです。

正直に言うと、ここで何をしているのかよくわかりません。だから、私はまだ OpenGLES 2.0 の優れたチュートリアルに参加しています。cocos2d-iphoneでの使い方が理想です。:-)

ありがとう、トーマス

于 2013-08-03T08:56:46.563 に答える