0

頂点の位置、色、インデックスデータを分離するために3つのバッファを作成しました。

頂点は正しく正方形としてレンダリングされますが、配列で定義された色ではなく白になりdynamicVertexDataます。

私はOpenGLES2.0を使用していますが、一般的なOpenGLの間違いを犯していると思います。

誰かがそれを見つけることができますか?

typedef struct _vertexStatic
{
    GLfloat position[2];
} vertexStatic;

typedef struct _vertexDynamic
{
    GLubyte color[4];
} vertexDynamic;

enum {
    ATTRIB_POSITION,
    ATTRIB_COLOR,
    NUM_ATTRIBUTES
};

// Separate buffers for static and dynamic data.
GLuint    staticBuffer;
GLuint    dynamicBuffer;
GLuint    indexBuffer;

const vertexStatic staticVertexData[] = {

    {0, 0},
    {50, 0},
    {50, 50},
    {0, 50},
};

vertexDynamic dynamicVertexData[] = {

    {0, 0, 255, 255},
    {0, 0, 255, 255},
    {0, 0, 255, 255},
    {0, 0, 255, 255},
};

const GLubyte indices[] = {

    0, 1, 2,
    2, 3, 0,
};


- (void)setupGL {

    CGSize screenSize = [UIApplication currentSize];
    CGSize screenSizeHalved = CGSizeMake(screenSize.width/2, screenSize.height/2);

    numIndices = sizeof(indices)/sizeof(indices[0]);

    [EAGLContext setCurrentContext:self.context];

    glEnable(GL_CULL_FACE); // Improves perfromance

    self.effect = [[GLKBaseEffect alloc] init];


    // The near and far plane are measured in units from the eye
    self.effect.transform.projectionMatrix = GLKMatrix4MakeOrtho(-screenSizeHalved.width,
                                                                     screenSizeHalved.width,
                                                                     -screenSizeHalved.height,
                                                                     screenSizeHalved.height,
                                                                     0.0f, 1.0f);

    self.preferredFramesPerSecond = 30;

    CreateBuffers();
}

void CreateBuffers()
{
    // Static position data
    glGenBuffers(1, &staticBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, staticBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(staticVertexData), staticVertexData, GL_STATIC_DRAW);

    // Dynamic color data
    // While not shown here, the expectation is that the data in this buffer changes between frames.
    glGenBuffers(1, &dynamicBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, dynamicBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(dynamicVertexData), dynamicVertexData, GL_DYNAMIC_DRAW);

    // Static index data
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}

void DrawModelUsingMultipleVertexBuffers()
{
    glBindBuffer(GL_ARRAY_BUFFER, staticBuffer);
    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStatic), 0);
    glEnableVertexAttribArray(ATTRIB_POSITION);

    glBindBuffer(GL_ARRAY_BUFFER, dynamicBuffer);
    glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexDynamic), 0);
    glEnableVertexAttribArray(ATTRIB_COLOR);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0);
    }

- (void)tearDownGL {

    [EAGLContext setCurrentContext:self.context];

    glDeleteBuffers(1, &_vertexBuffer);
    glDeleteBuffers(1, &_indexBuffer);
    //glDeleteVertexArraysOES(1, &_vertexArray);

    self.effect = nil;    

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
//    view.drawableMultisample = GLKViewDrawableMultisample4X; // Smoothes jagged lines. More processing/memory
    view.drawableColorFormat = GLKViewDrawableColorFormatRGB565; // Lower colour range. Less processing/memory
    [self setupGL];
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.effect prepareToDraw];

    DrawModelUsingMultipleVertexBuffers();
}

@end
4

2 に答える 2

2

とエントリポイントを使用して、頂点バッファを有効にしてATTRIB_COLORバインディングポイントにバインドしましたが、それらをどのように処理するかを指定していません。glVertexAttribPointerglEnableVertexAttribArray

OpenGLES 2.0は、固定機能のレンダリングパイプラインのほとんどを削除したため、頂点バッファーを使用するには、頂点シェーダーを作成する必要があります。1.Xでは、glColorPointerエントリポイントを使用して、固定機能パイプラインに頂点の色を指定できます。

于 2013-01-30T20:54:05.243 に答える
1

openGL ES 2.0を実行することができた場合(起動時に難しい場合があります)、必要な図面が得られない場合は、デバイスで実行することを強くお勧めします。これにより、XCodeの追加機能でopenGLをデバッグできるようになります。

ここに画像の説明を入力してください

次に、次のことができます。

  • サイクルを段階的に進めて呼び出しを描画し、色/深度バッファの画像が更新されるのを確認します
  • 境界のあるglオブジェクトをすべて表示
  • VAOのコンテンツを参照してください(VAOが指す実際のデータを確認でき、欠落しているデータ/ポインターを見つけるのに役立ちます)
  • プログラム:シェーダーをGPUでライブ編集できます(glバインドされたオブジェクト->プログラム:ダブルクリック!)シェーダーを磨くのに便利です

これは、興味がある場合は、GLKitのGLKBaseEffect内部動作についての洞察を得るためにも非常に役立ちます-実際には、openGLプログラムを生成するだけであり、その特定の頂点およびフラグメントシェーダーコードは、設定したプロパティに依存します...

忘れたプロパティはGLKBaseEffectですcolorMaterialEnabled

于 2013-02-01T03:34:22.583 に答える