您的位置:首页 > 运维架构

opengl入门系列1- OpenGL纹理环绕

2014-09-11 10:23 411 查看
//在Ubuntu12.04  QT 上编译通过;

先上代码:

#include <GL/glut.h>

#include <stdlib.h>

#include <stdio.h>

/*    Create checkerboard texture    */

#define    checkImageWidth 64

#define    checkImageHeight 64

static GLubyte checkImage[checkImageHeight][checkImageWidth][4];

#ifdef GL_VERSION_1_1

static GLuint texName;

#endif

void makeCheckImage(void)

{

   int i, j, c;

    

   for (i = 0; i < checkImageHeight; i++) {

      for (j = 0; j < checkImageWidth; j++) {

         c = ((((i&0x8)==0)^((j&0x8))==0))*255;

         checkImage[i][j][0] = (GLubyte) c;

         checkImage[i][j][1] = (GLubyte) c;

         checkImage[i][j][2] = (GLubyte) c;

         checkImage[i][j][3] = (GLubyte) 255;

      }

   }

}

void init(void)

{    

   glClearColor (0.0, 0.0, 0.0, 0.0);

   glShadeModel(GL_FLAT);

   glEnable(GL_DEPTH_TEST);

   makeCheckImage();

   //设置像素对齐模式 对glTexImage2D,glTexSubImage2D 有影响    

   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

#ifdef GL_VERSION_1_1

   glGenTextures(1, &texName);

   glBindTexture(GL_TEXTURE_2D, texName);

#endif

    /*

    *纹理坐标可以超出(0, 1)范围,并且在纹理映射过程中可以重复映射或约简映射。、

    *在重复映射的情况下,纹理可以在s,t方向上重复

    */

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

   //GL_NEAREST: 使用纹理中坐标最接近的一个像素的颜色作为需要绘制的像素颜色, 锯齿现象明显

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

#ifdef GL_VERSION_1_1

   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,

                0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

#else

   glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight,

                0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

#endif

}

void display(void)

{

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glEnable(GL_TEXTURE_2D);

   //设置的纹理模式

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

#ifdef GL_VERSION_1_1

   glBindTexture(GL_TEXTURE_2D, texName);

#endif

   glBegin(GL_QUADS);

   glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);

   glTexCoord2f(0.0, 3.0); glVertex3f(-2.0, 1.0, 0.0);

   glTexCoord2f(3.0, 3.0); glVertex3f(0.0, 1.0, 0.0);

   glTexCoord2f(3.0, 0.0); glVertex3f(0.0, -1.0, 0.0);

   glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);

   glTexCoord2f(0.0, 3.0); glVertex3f(1.0, 1.0, 0.0);

   glTexCoord2f(3.0, 3.0); glVertex3f(2.41421, 1.0, -1.41421);

   glTexCoord2f(3.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);

   glEnd();

   glFlush();

   glDisable(GL_TEXTURE_2D);

}

void reshape(int w, int h)

{

   glViewport(0, 0, (GLsizei) w, (GLsizei) h);

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity();

   gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);

   glMatrixMode(GL_MODELVIEW);

   glLoadIdentity();

   glTranslatef(0.0, 0.0, -3.6);

}

void keyboard (unsigned char key, int x, int y)

{

   switch (key) {

      case 's':

         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

         glutPostRedisplay();

         break;

      case 'S':

         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

         glutPostRedisplay();

         break;

      case 't':

         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

         glutPostRedisplay();

         break;

      case 'T':

         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

         glutPostRedisplay();

         break;

      case 27:

         exit(0);

         break;

      default:

         break;

   }

}

int main(int argc, char** argv)

{

   glutInit(&argc, argv);

   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

   glutInitWindowSize(250, 250);

   glutInitWindowPosition(100, 100);

   glutCreateWindow(argv[0]);

   init();

   glutDisplayFunc(display);

   glutReshapeFunc(reshape);

   glutKeyboardFunc(keyboard);

   glutMainLoop();

   return 0;

}

//工程设置:

TEMPLATE = app

CONFIG += console

CONFIG -= qt

SOURCES += \

    wrap.c

LIBS += -L/usr/lib/

LIBS += -lglut

LIBS += -lGL

LIBS += -lGLU

//效果:



//背景知识:

纹理相关函数:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: