2

Cocoa、GLUT、OpenGLフレームワークを組み合わせてティーポットを描きました。
私は通常これをプレーンCで行いますが、CocoaボタンなどをOpenGLと混同する必要があります。これは、適切なCコードです。

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

そしてこれが結果です:

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

次に、NSOpenGLViewをサブクラス化し、このCコードと同じことを、サイズを変えて実行しますが、メーターとライトは同じです。

@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

そしてこれが結果です:

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

それはかなり醜いです、そして私が同じメーターとライトを使用したことを考えると、私はココアとOpenGLを混ぜたもので何か間違ったことをしていると思います。

4

1 に答える 1

3

GL コンテキストを作成するときは、必ず深度バッファーを要求してください。デフォルトでは取得できない場合があります。

于 2012-12-03T15:56:30.443 に答える