0

まず第一に、私の英語で申し訳ありませんが、私の問題は次のとおりです。

OpenGL ES を学習するためのチュートリアルに従っています。画面の中央に三角形を描く必要があります。彼らが示す画像では、三角形が画面の端に触れていません(頂点のz座標が原因だと思います)

彼らが作成するように指示する頂点は、これらの座標にあります。

(0.0, 1.0, -3.0) (1.0, 0.0, -3.0) (-1.0, 0.0, -3.0)

チュートリアルは最新ではないので、個人的なコードで行いました:

//
//  EAGLView.m
//  OpenGlintro
//
//  Created by Arnaud Miguet on 01/12/12.
//  Copyright (c) 2012 Tap‘n'Develop. All rights reserved.
//

#import "EAGLView.h"

@implementation EAGLView

+ (Class) layerClass {
    return [CAEAGLLayer class];
}

- (void)setupVBOs {

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        CAEAGLLayer *EAGLLayer = (CAEAGLLayer *) super.layer;
        EAGLLayer.opaque = YES;

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

        if (!context || ![EAGLContext setCurrentContext:context]) {
            [self release];
            return nil;
        }

        glEnable (GL_DEPTH_TEST);

        GLuint framebuffer , renderbuffer;

        glGenBuffers(1, &framebuffer);
        glGenBuffers(1, &renderbuffer);

        glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
        glViewport(10, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
        [self compileShaders];
        [self setupVBOs];
        [self render];
    }
    return self;
}


- (void)render {
    glClearColor(0.7, 0.7, 0.7, 1.0);


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 1
    glViewport(0, 0, self.frame.size.width, self.frame.size.height);

    // 2
    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE,
                          sizeof(Vertex), 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE,
                          sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

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

    [context presentRenderbuffer:GL_RENDERBUFFER];
}

- (GLuint)compileShader:(NSString*)shaderName withType:(GLenum)shaderType {

    // 1
    NSString* shaderPath = [[NSBundle mainBundle] pathForResource:shaderName
                                                           ofType:@"glsl"];
    NSError* error;
    NSString* shaderString = [NSString stringWithContentsOfFile:shaderPath
                                                       encoding:NSUTF8StringEncoding error:&error];
    if (!shaderString) {
        NSLog(@"Error loading shader: %@", error.localizedDescription);
        exit(1);
    }

    // 2
    GLuint shaderHandle = glCreateShader(shaderType);

    // 3
    const char * shaderStringUTF8 = [shaderString UTF8String];
    int shaderStringLength = [shaderString length];
    glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength);

    // 4
    glCompileShader(shaderHandle);

    // 5
    GLint compileSuccess;
    glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);
    if (compileSuccess == GL_FALSE) {
        GLchar messages[256];
        glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]);
        NSString *messageString = [NSString stringWithUTF8String:messages];
        NSLog(@"%@", messageString);
        exit(1);
    }

    return shaderHandle;

}

- (void)compileShaders {

    // 1
    GLuint vertexShader = [self compileShader:@"SimpleVertex"
                                     withType:GL_VERTEX_SHADER];
    GLuint fragmentShader = [self compileShader:@"SimpleFragment"
                                       withType:GL_FRAGMENT_SHADER];

    // 2
    GLuint programHandle = glCreateProgram();
    glAttachShader(programHandle, vertexShader);
    glAttachShader(programHandle, fragmentShader);
    glLinkProgram(programHandle);

    // 3
    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
    if (linkSuccess == GL_FALSE) {
        GLchar messages[256];
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
        NSString *messageString = [NSString stringWithUTF8String:messages];
        NSLog(@"%@", messageString);
        exit(1);
    }

    // 4
    glUseProgram(programHandle);

    // 5
    _positionSlot = glGetAttribLocation(programHandle, "Position");
    _colorSlot = glGetAttribLocation(programHandle, "SourceColor");
    glEnableVertexAttribArray(_positionSlot);
    glEnableVertexAttribArray(_colorSlot);
}

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

const Vertex Vertices[] = {
    {{0.0, 1.0, -2}, {1, 0, 0, 1}},
    {{1.0, 0.0, -2}, {1, 0, 0, 1}},
    {{-1.0, 0.0, 0}, {1, 0, 0, 1}}
};

const GLubyte Indices[] = {
    0,1,2
};
/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
 {
 // Drawing code
 }
 */

@end

しかし、背景が z=-1 座標に描かれているため、頂点が表示されません...誰か助けてくれますか? 私はこれに対する解決策を見つけることができません...

4

1 に答える 1

0

一見すると、レンダー関数は viewDidLoad で 1 回だけ呼び出されているように見えます。これは、代わりに、drawRect などの継続的な更新を伴うメソッドで実装する必要があります。

OpenGL ES の学習曲線は非常に急勾配であり、iOS では GLKit フレームワークを実装することで多くのことを学ぶことができます。さまざまなタイプのバッファーへの呼び出しをすべて保存し、描画/更新関数のボイラープレート コードのほとんどを処理します。

このチュートリアルは、開始するのに非常に適した場所です: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

于 2012-12-23T01:16:35.150 に答える