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 回答