2

iOSでOpenGLを学ぼうとしています。私はこのチュートリアルに従っています。

http://www.raywenderlich.com/5235/beginning-opengl-es-2-0-with-glkit-part-2

慎重に手順に従ったと確信していますが、最後に到達すると、画面に図形が表示されません。

https://gist.github.com/seanhess/5356598

背景色が変化しているので、OpenGL は一般的に機能しています。glDrawElements への呼び出しだけでは何もしていないようです。

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

彼はいくつかのデモ コードを持っていますが、チュートリアルで書いたコードと同じではありません。貼り付ける前に、これが機能しない理由を理解したいと思います。

GLKBaseEffect はどこに描画されるはずですか? 実際にどのように使用したかはわかりません。

4

1 に答える 1

5

すべての頂点が同じであるため、次は間違っているようです。

// these are not TRIANGLES, they are vertices
const Vertex Vertices[]  = {
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, -1, 0}, {1, 0, 0, 1}},
};

他のすべてが正しい場合でも、すべての頂点が一致しているため、三角形は縮退しています。座標を修正するときは、インデックスが反時計回りに頂点を参照していることを確認してください。最初の実験では、

glDisable(GL_CULL_FACE);

描く前に。次のように頂点を選択してみてください。

// these are not TRIANGLES, they are vertices
const Vertex Vertices[]  = {
    {{-.9, -.9, 0}, {1, 0, 0, 1}},
    {{.9, -.9, 0}, {1, 0, 0, 1}},
    {{-.9, .9, 0}, {1, 0, 0, 1}},
    {{.9, .9, 0}, {1, 0, 0, 1}},
};

// These are the trianges. Just reference the vertices
const GLubyte Indices[] = {
    0, 1, 2,
    2, 1, 3
};

編集

update の 2 番目の部分をコメントアウトしてみてください。

/*
// Set the projection matrix of the effect. It defines the field of view
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 40., 10.0);
self.effect.transform.projectionMatrix = projectionMatrix;

// Rotate about z axis
// the model view matrix is the transform applied to any geometry that the effect renders
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0, 0, -6);
_rotation += 90 * self.timeSinceLastUpdate;
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(_rotation), 0, 0, 1);
self.effect.transform.modelviewMatrix = modelViewMatrix;
 */

定義したマトリックスは、オブジェクトを最終的なイメージから外します。画面に何も表示されない場合、最初に確認すべきことの 1 つは変換行列です。あなたの場合、問題は透視変換にあります:

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 40., 10.0);

移動および回転したオブジェクトを描画するには、この呼び出しの 3 番目と 4 番目のパラメーターの間の距離に配置する必要があります。実際には、3 番目のパラメーターはいわゆる平面の距離であり、4 番目のパラメーターよりも小さくする必要があります。ファープレーン。安全な賭けは、通常、これら 2 つのパラメーターに対して 1 と 100 です。

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 1.0, 100.0);

編集 2

以下は動作中のバージョンです。

//
//  HelloGLKitViewController.m
//  OpenGL2Tutorial
//
//  Created by Sean Hess on 4/10/13.
//  Copyright (c) 2013 Sean Hess. All rights reserved.
//

#import "HelloGLKitViewController.h"

typedef struct {
    float Position[3];
    float Color[4];
} Vertex;

// these are not TRIANGLES, they are vertices
const Vertex Vertices[]  = {
    {{-.9, -.9, 0}, {1, 0, 0, 1}},
    {{.9, -.9, 0}, {1, 0, 0, 1}},
    {{-.9, .9, 0}, {1, 0, 0, 1}},
    {{.9, .9, 0}, {1, 0, 0, 1}},
};

// These are the trianges. Just reference the vertices
const GLubyte Indices[] = {
    0, 1, 2,
    2, 1, 3
};


@interface HelloGLKitViewController () {
    GLuint _vertexBuffer;
    GLuint _indexBuffer;
    float _rotation;
    float _currentRed;
    BOOL _increasing;
}

@property (nonatomic, strong) EAGLContext * context;
@property (nonatomic, strong) GLKBaseEffect * effect;
@end

@implementation HelloGLKitViewController

// I think this method just fills the objective-c stuff with the information from my c structs
- (void)setupGL {
    [EAGLContext setCurrentContext:self.context];
    self.effect = [GLKBaseEffect new];

    glGenBuffers(1, &_vertexBuffer); // supposed to be an array of buffers, doing that trick again
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); // when I say "GL_ARRAY_BUFFER" I mean _vertexBuffer
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

    glGenBuffers(1, &_indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
}

- (void)tearDownGL {
    [EAGLContext setCurrentContext:self.context];
    glDeleteBuffers(1, &_vertexBuffer);
    glDeleteBuffers(1, &_indexBuffer);
    self.effect = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!self.context) NSLog(@"FAiled to create ES Context");
    GLKView * view = (GLKView *)self.view;
    view.context = self.context;

    // will automatically pause when interrupted
    self.pauseOnWillResignActive = YES;

    [self setupGL];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    [self tearDownGL];
}

#pragma mark - GLKViewDelegate

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

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

    // have to call after you change any properties in the effect, before drrawing
    [self.effect prepareToDraw];

    // We don't have to do this again, since we did it above in setupGL
    // They're already bound to GL_ARRAY_BUFFER and GL_ELEMENT_ARRAYBUFFER
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

    // remember my vertex array contains Vertex(s)
    // so we're telling it how to read it
    // position is 3 floats, the offset is based on that offsetof function
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) offsetof(Vertex, Position));

    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) offsetof(Vertex, Color));

    // 1. pretty much always use triangles
    // 2. the number of vertices to render. tricky way to do .length on array
    // 3. the data type
    // 4. seems like should be pointer to indices. We're using VBOs, so it's already set to the GL_ELEMENT_ARRAY_BUFFER. So give it 0.
    glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

}

- (void)update {
    if (_increasing) {
        _currentRed += 1.0 * self.timeSinceLastUpdate;
    } else {
        _currentRed -= 1.0 * self.timeSinceLastUpdate;
    }
    if (_currentRed >= 1.0) {
        _currentRed = 1.0;
        _increasing = NO;
    }
    if (_currentRed <= 0.0) {
        _currentRed = 0.0;
        _increasing = YES;
    }


    // Set the projection matrix of the effect. It defines the field of view
    float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 1.0, 100.0);
    self.effect.transform.projectionMatrix = projectionMatrix;


    // Rotate about z axis
    // the model view matrix is the transform applied to any geometry that the effect renders
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0, 0, -6);
    _rotation += 90 * self.timeSinceLastUpdate;
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(_rotation), 0, 0, 1);
    self.effect.transform.modelviewMatrix = modelViewMatrix;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    self.paused = !self.paused;

    NSLog(@"timeSinceLastUpdate: %f", self.timeSinceLastUpdate);
    NSLog(@"timeSinceLastDraw: %f", self.timeSinceLastDraw);
    NSLog(@"timeSinceFirstResume: %f", self.timeSinceFirstResume);
    NSLog(@"timeSinceLastResume: %f", self.timeSinceLastResume);
}


@end
于 2013-04-10T17:33:17.957 に答える