2012-12-03 3 views
2

찻 주전자를 그리기 위해 코코아, GLUT 및 OpenGL 프레임 워크를 혼합했습니다.
내가 보통 일반 C에서이 작업을 수행하지만 OpenGL을 가진 코코아 버튼 및 구성 요소를 혼합 할 필요가, 이것은 corrispettive C 코드 :코코아 및 OpenGL 찻 주전자가 올바르게 그려지지 않았습니다.

#import <OpenGL/OpenGL.h> 
#import <GLUT/GLUT.h> 
#import <math.h> 
#include "utility.h" 

GLuint width=640, height=480; 
GLfloat angle=0.0; 


void init() 
{ 

    glEnable(GL_DEPTH_TEST); 
    glViewport(-500, -500, 1000, 1000); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, width/(float)height, 1, 1000); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0); 

    // Luci 

    glShadeModel(GL_FLAT); 

    glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat[]) {0,0,0}); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat[]) {1,1,0}); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat[]) {0.5,0.5,0}); 

    glMaterialfv(GL_FRONT, GL_AMBIENT, (const GLfloat[]) {1,0,0}); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, (const GLfloat[]) {1,0.25,0}); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, (const GLfloat[]) {1,0.75,0}); 
    glMaterialfv(GL_FRONT, GL_SHININESS, (const GLfloat[]) {1,1,0}); 

    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 

} 

void display() 
{ 
    glClearColor(BLACK); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushMatrix(); 
    glRotatef(angle, 0, 1, 0); 
    glutSolidTeapot(10); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void keyboard(unsigned char key, int x, int y) 
{ 
    if(key=='+') 
    { 
     angle+=5.0; 
    } 
    else if(key=='-') 
    { 
     angle-=5.0; 
    } 
    else 
    { 
     return; 
    } 
    makeRound(&angle); 
    glutPostRedisplay(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(width, height); 
    glutCreateWindow(argv[0]); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    init(); 
    glutMainLoop(); 
    return 0; 
} 

그리고 이것은 결과입니다

enter image description here

그렇다면 NSOpenGLView를 서브 클래 싱하는 것과이 C 코드를 다른 크기로 똑같이하는 것이지만 meterials과 표시등은 동일합니다.

@implementation MyView 

@synthesize angle; 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
    } 
    return self; 
} 


- (void) prepareOpenGL 
{ 
    NSOpenGLContext* context= self.openGLContext; 
    GLfloat width= self.bounds.size.width; 
    GLfloat height= self.bounds.size.height; 

    [context makeCurrentContext]; 
    glEnable(GL_DEPTH_TEST); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, width/height, 1, 1000); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0); 

    // Lighting 

    glShadeModel(GL_FLAT); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat[]) {0,0,0}); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat[]) {1,1,0}); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat[]) {0.5,0.5,0}); 

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (const GLfloat[]) {1,0,0}); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (const GLfloat[]) {1,0.25,0}); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (const GLfloat[]) {1,0.75,0}); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, (const GLfloat[]) {1,1,0}); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 

} 


- (void)drawRect:(NSRect)dirtyRect 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushMatrix(); 
    glRotatef(angle, 0, 1, 0); 
    glutSolidTeapot(20); 
    glPopMatrix(); 

    glFlush(); 
} 

#pragma mark - Actions 

- (IBAction) increaseAngle :(id)sender 
{ 
    angle+=5.0; 
    if(angle>360.0) 
    { 
     angle-=360.0; 
    } 
    [self setNeedsDisplay: YES]; 
} 

- (IBAction) decreaseAngle:(id)sender 
{ 
    angle-=5.0; 
    if(angle<0.0) 
    { 
     angle+=360.0; 
    } 
    [self setNeedsDisplay: YES]; 
} 

@end 
,

는 그리고이 결과 : 꽤 추한 내가 같은 meterials와 조명을 사용하는 것을 고려의

enter image description here

, 나는 코코아와 OpenGL을 혼합하여 수행 한에서 뭔가를 잘못하고 있어요 생각합니다.

답변

3

GL 컨텍스트를 만들 때 깊이 버퍼를 요청하십시오. 기본적으로 하나를 얻을 수 없습니다.

+0

진정한 NSOpenGLContext를 만들지 않습니다. NSOpenGLView (self.openGLContext)에서 검색합니다. NSOpenGLPixelBuffer에서 찾고 있습니다. 어떻게 깊이를 활성화합니까? 나는 의사에게 그것을 찾을 수 없다. –

+0

운좋게도 열려있는 gl보기의 속성 검사기에서 깊이를 32 비트로 설정하여 xib 파일을 통해이 작업을 수행 할 수있었습니다. –

관련 문제