2012-12-01 4 views
2

우선 영어로 미안해.OpenGL ES 삼각형이 보이지 않음

나는 OpenGL을 ES에 새로 온 사람과 나는이 정점 간단한 삼각형을 그리려고 :

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

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

이러한 인덱스; {{0, 0, 0 :

const GLubyte Indices[] = { 
    0,1,2 
}; 

그러나 삼각형 내가 0,2,3에 인덱스를 변경하는 경우, 그것은 정점 0,2 검은 정점을 가진 삼각형을 표시합니다 ... 나타나지 않습니다 }, {0,0,0,1}},하지만 4 번째 꼭지점이 없습니다 ... 누군가가 나를 설명 할 수 있다는 것을 전혀 이해하지 못합니까? 당신이 버퍼를 결합하기 전에

// 
// 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; 
     } 

     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, 104.0/255.0, 55.0/255.0, 1.0); 
    glClear(GL_COLOR_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), 
       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.0}, {1, 0, 0, 1}}, 
    {{1.0, 0.0, -2.0}, {1, 0, 0, 1}}, 
    {{-1.0, 0.0, -2.0}, {1, 0, 0, 1}}, 
}; 

const GLubyte Indices[] = { 
    0,2,3 
}; 

@end 

답변

0

는 정점 배열을 추가

여기 내 엑스 코드보기 코드입니다.

GLuint vao; 
glGenVertexArray(1, &vao); 
glBindVertexArray(vao); 
+0

당신이 나에게 준 튜토리얼은 괜찮습니다하지만 우리 때문에 죽은 링크의 다운로드 할 수있는 템플릿을 사용하여 ... –

+0

템플릿? 모든 링크가 저에게 잘 어울립니다 – TheAmateurProgrammer

+0

OpenGLES 2.0에서 Vertex Array Objects를 사용할 수 있습니까? – kelin