• 纹理坐标的实例代码


    纹理坐标的实例代码1

    #include 
    <Windows.h>
    #include 
    <gl/glut.h>

    #define ImageWidth 64
    #define ImageHeight 64
    GLubyte Image[ImageWidth][ImageHeight][
    3];

    void makeImage(void)
    {
        
    int i, j, r , g, b;
        
    for (i=0;i<ImageWidth;i++)
        {
            
    for (j=0;j<ImageHeight;j++)
            {
                r 
    = (i*j)%255;
                g 
    = (i*4)%255;
                b 
    = (4*j)%255;
                Image[i][j][
    0= (GLubyte)r;
                Image[i][j][
    1= (GLubyte)g;
                Image[i][j][
    2= (GLubyte)b;
            }
        }
    }


    void init(void)
    {
        glClearColor(
    0.0,0.0,0.0,0.0);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);

        makeImage();
        glPixelStorei(GL_UNPACK_ALIGNMENT,
    1);

        
        
    //
        
    // 定义纹理
        
    //
        
    // void glTexImage2D(GLenum target,GLint level,GLint components,
        
    //             GLsizei width, glsizei height,GLint border,
        
    //              GLenum format,GLenum type, const GLvoid *pixels);
        
    // target,GL_TEXTURE表示二维纹理映射
        
    // level, 多级分辨率的纹理图像的级数,0,表示只有一种分辨率
        
    // components, 从1-4的整数,指出RGBA中那些分量用于调整和混合
        
    //             1 R分量
        
    //             2 R和A
        
    //             3 R/G/B三个
        
    //             4 RGBA四个
        
    // width,height, 纹理图像的长宽,至少64*64,若都为0,则纹理映射关闭
        
    // border, 纹理边宽
        
    // format, 格式;type, 数据类型。 即pixels数据的格式和数据类型。
        
    // pixels, 纹理数据的字符数组
        glTexImage2D(GL_TEXTURE_2D,0,3,
            ImageWidth,ImageHeight, 
    0,
            GL_RGB, GL_UNSIGNED_BYTE,
    &Image[0][0][0]);
        
    //
        
    // 控制滤波
        
    //
        
    // 纹理控制函数
        
    // void glTexParameter*[v](GLenum target,GLenum pname,TYPE param);
        
    // target, GL_TEXTURE_1D或GL_TEXTURE_2D
        
    // name, GL_TEXTURE_MAG_FILTER, 纹理放大的方法(GL_NEAREST或GL_LINEAR)
        
    //       GL_TEXTURE_MIN_FILTER, 缩小的方法(GL_NEAREST,GL_LINEAR,...另外还有4种)
        
    //       GL_TEXTURE_WRAP_S,在s方向的重复方式(GL_CLAMP或GL_REPEAT)
        
    //       GL_TEXTURE_WRAP_T,在t方向的重复方式(GL_CLAMP或GL_REPEAT)
        
    // param, name定义的参数的值,
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

        
    // 映射方式
        
    // void glTexEnv{if}[v](GLenum target,GLenum pname,TYPE param);
        
    // 设置纹理映射方式。参数target必须是GL_TEXTURE_ENV;
        
    // 若参数pname是GL_TEXTURE_ENV_MODE,
        
    //    则参数param可以是GL_DECAL、GL_MODULATE或GL_BLEND,
        
    //    以说明纹理值怎样与原来表面颜色的处理方式;
        
    // 若参数pname是GL_TEXTURE_ENV_COLOR,
        
    //    则参数param是包含四个浮点数(分别是R、G、B、A分量)的数组,
        
    //    这些值只在采用GL_BLEND纹理函数时才有用。
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);


        
    // 启动纹理映射
        glEnable(GL_TEXTURE_2D);

        glShadeModel(GL_FLAT);

    }


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

        
    /* 设置纹理坐标和物体几何坐标 */
        glBegin(GL_QUADS);
        
    // 纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,
        
    // 称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。
        
    // 一维纹理常用s坐标表示,
        
    // 二维纹理常用(s, t)坐标表示,
        
    // 目前忽略r坐标,q坐标象w一样,一般值为1,主要用于建立齐次坐标。
        glTexCoord2f(0.00.0); glVertex3f(-2.0-1.00.0);
        glTexCoord2f(
    0.01.0); glVertex3f(-2.01.00.0);
        glTexCoord2f(
    1.01.0); glVertex3f(0.01.00.0);
        glTexCoord2f(
    1.00.0); glVertex3f(0.0-1.00.0);
        glTexCoord2f(
    0.00.0); glVertex3f(1.0-1.00.0);
        glTexCoord2f(
    0.01.0); glVertex3f(1.01.00.0);
        glTexCoord2f(
    1.01.0); glVertex3f(2.414211.0-1.41421);
        glTexCoord2f(
    1.00.0); glVertex3f(2.41421-1.0-1.41421);
        glEnd();

        glFlush();
    }

    void reshape(int w, int h)
    {
        glViewport(
    00, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(
    60.01.0*(GLfloat)w/(GLfloat)h, 1.030.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(
    0.00.0-3.6);

    }

    //void mouse(int button, int state, int x, int y)
    //{
    //    switch (button)
    //    {
    //    case GLUT_LEFT_BUTTON:
    //        break;
    //    case GLUT_MIDDLE_BUTTON:
    //        break;
    //    default:
    //        break;
    //    }
    //}

    int main(int argc, char** argv)
    {
        
    // GLUT初始化窗口的5个必须的步骤
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_SINGLE
    |GLUT_RGBA);
        glutInitWindowPosition(
    250,250);
        glutInitWindowSize(
    500,500);
        glutCreateWindow(
    "Hello");

        
    // 一些初始化操作
        init();

        
    // 添加回调*****重要
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        
    //glutMouseFunc(mouse);

        
    // 真正开始绘制
        glutMainLoop();

        
    return 0;
    }
  • 相关阅读:
    第三章 Java程序优化(待续)
    第二章 设计优化(待续)
    第一章 Java性能调优概述
    第十章 Executor框架
    第九章 Java中线程池
    第八章 Java中的并发工具类
    第七章 Java中的13个原子操作类
    Hihocoder [Offer收割]编程练习赛70 解题报告 By cellur925
    USACO Training刷题记录 By cellur925
    Trie树的小应用——Chemist
  • 原文地址:https://www.cnblogs.com/mumuliang/p/1893343.html
Copyright © 2020-2023  润新知