opengl学习一

opengl红宝书买了一年了,一直想好好学学,总是感觉没时间,决定最近抽时间高下。

//
//  main.c
//  TestSwap
//
//  Created by 磊 王 on 12-10-18.
//  Copyright (c) 2012年. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <GLUT/glut.h>

static GLfloat spin = 0.0;

void init(void)
{
    // 设置清除窗口颜色为黑色
    glClearColor(0.0, 0.0, 0.0, 0.0);
    // 恒定着色模式
    glShadeModel(GL_FLAT);
}

void display(void)
{
    // 清除窗口
    glClear(GL_COLOR_BUFFER_BIT);
    // 保存当前矩阵
    glPushMatrix();
    // 旋转函数,spin是旋转角度,后面三位参数是旋转向量,右手法则确定方向
    glRotatef(spin, 0.0, 0.0, 1.0);
    // 颜色
    glColor3f(1.0, 0.0, 0.0);
    // 绘制矩形
    glRectf(-25.0, -25.0, 25.0, 25.0);
    // 恢复矩阵
    glPopMatrix();
    // 交换缓冲区
    glutSwapBuffers();
}

void spinDisplay(void)
{
    spin = spin + .1;
    if (spin > 360.0) {
        spin -= 360.0;
    }
    // 通知glutMainLoop重绘
    glutPostRedisplay();
}

void reshape(int w, int h)
{
    // 设置视口
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h) {
        glOrtho(-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w, 0.1, -1.0);
    }else {
        glOrtho(-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, 0.1, -1.0);
    }
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
    switch (button) {
        case GLUT_LEFT_BUTTON:
            if (state == GLUT_DOWN) {
                glutIdleFunc(spinDisplay);
            }
            break;
        case GLUT_RIGHT_BUTTON:
            if (state == GLUT_DOWN) {
                glutIdleFunc(NULL);
            }
            break;
        default:
            break;
    }
}

int main(int argc, const char * argv[])
{
    // 初始化GLUT,处理命令行参数
    glutInit(&argc, argv);
    // 显示模式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    // 窗口大小
    glutInitWindowSize(250, 250);
    // 创建名为animation的窗口
    glutCreateWindow("animation");
    init();
    // 注册显示回调函数
    glutDisplayFunc(display);
    // 注册重绘函数,当窗口大小内容发生变化时回调包括窗口刚创建时
    glutReshapeFunc(reshape);
    // 注册鼠标事件处理函数
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;
}


其中有个函数glOrtho,一知半解的,查了好多资料,自己调了下,发现网上说的很多都没说清楚。

前面四个参数没什么说的,就是一个矩形大小,确定视景大小的,最后的near和far比较有意思。

我通过改动这两个参数发现,同为正和同为负都看不到图形,一正一负可以看见一个正方形。由于我画的是一个xy平面的正方形,Z坐标为0,在Z轴上没有深度。

一正一负的参数说明所画正方形在视景体内部,同为正和同位负时则在视景体外部,此时就看不到所画的物体。

我的理解是near和far就是确定视口位置和视口方向及视景体深度,比如near和far分别为 1,-1,那么视口在Z轴的1位置,向屏幕里面方向,视景体深度为2,所画物体在视景体内部则能被看到,否则看不到。

知之为知之,不知谷歌之

你可能感兴趣的:(null,buffer,animation,360,button,图形)