zoukankan      html  css  js  c++  java
  • OpenGL第十四节:绘制重复纹理

    From LTexture.cpp

      #include "LTexture.h"
      #include <IL/il.h>
      #include <IL/ilu.h>
      GLenum DEFAULT_TEXTURE_WRAP = GL_REPEAT;

    bool LTexture::loadTextureFromPixels32( GLuint* pixels, GLuint imgWidth, GLuint imgHeight, GLuint texWidth, GLuint texHeight )
    {
      freeTexture();

      mImageWidth = imgWidth;
      mImageHeight = imgHeight;
      mTextureWidth = texWidth;
      mTextureHeight = texHeight;

      glGenTextures( 1, &mTextureID );

      glBindTexture( GL_TEXTURE_2D, mTextureID );

      glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mTextureWidth, mTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );

      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );//线性放大
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );//线性缩小
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, DEFAULT_TEXTURE_WRAP );//s坐标包裹模式
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, DEFAULT_TEXTURE_WRAP );//t坐标包裹模式

      glBindTexture( GL_TEXTURE_2D, NULL );

      GLenum error = glGetError();
      if( error != GL_NO_ERROR )
      {
        printf( "Error loading texture from %p pixels! %s ", pixels, gluErrorString( error ) );
        return false;
      }

      return true;
    }

    LUtil.cp

    LTexture gRepeatingTexture;
    GLfloat gTexX = 0.f, gTexY = 0.f;
    int gTextureWrapType = 0;

    bool loadMedia()
    {
      if( !gRepeatingTexture.loadTextureFromFile( "14_repeating_textures/texture.png" ) )
      {
        printf( "Unable to load repeating texture! " );
        return false;
      }

      return true;
    }

    void update()
    {
      gTexX++;
      gTexY++;

      if( gTexX >= gRepeatingTexture.textureWidth() )
      {
        gTexX = 0.f;
      }
      if( gTexY >= gRepeatingTexture.textureHeight() )
      {
        gTexY = 0.f;
      }
    }

    void render()
    {
      glClear( GL_COLOR_BUFFER_BIT );

      GLfloat textureRight = (GLfloat)SCREEN_WIDTH / (GLfloat)gRepeatingTexture.textureWidth();
      GLfloat textureBottom = (GLfloat)SCREEN_HEIGHT / (GLfloat)gRepeatingTexture.textureHeight();
      glBindTexture( GL_TEXTURE_2D, gRepeatingTexture.getTextureID() );

      glMatrixMode( GL_TEXTURE );

      glLoadIdentity();
      glTranslatef( gTexX / gRepeatingTexture.textureWidth(), gTexY / gRepeatingTexture.textureHeight(), 0.f );

      glBegin( GL_QUADS );
        glTexCoord2f( 0.f, 0.f ); glVertex2f( 0.f, 0.f );
        glTexCoord2f( textureRight, 0.f ); glVertex2f( SCREEN_WIDTH, 0.f );
        glTexCoord2f( textureRight, textureBottom ); glVertex2f( SCREEN_WIDTH, SCREEN_HEIGHT );
        glTexCoord2f( 0.f, textureBottom ); glVertex2f( 0.f, SCREEN_HEIGHT );
      glEnd();

      glutSwapBuffers();
    }

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

    {

        if( key == 'q' )

        {

            gTextureWrapType++;

            if( gTextureWrapType >= 2 )

            {

                gTextureWrapType = 0;

            }

            glBindTexture( GL_TEXTURE_2D, gRepeatingTexture.getTextureID() );

            switch( gTextureWrapType )

            {

                case 0:

                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );

                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

                    printf( "%d: GL_REPEAT ", gTextureWrapType );

                break;

                case 1:

                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );

                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

                    printf( "%d: GL_CLAMP ", gTextureWrapType );

                break;

            }

        }

    }

  • 相关阅读:
    父级设置display:flex;子级宽度无效的解决办法
    小程序注意事项
    css 字体默认有高度 怎么去掉
    小程序长按识别问题
    css 列表多列多行 同行等高样式
    AndroidManifest.xml:90: error: Error: String types not allowed (at 'largeHeap' with value 'auto').
    10.4.2 ListView.ScrollViewChange存在的问题
    【转】UniTreeMenu控件不显示滚动条的解决办法
    Delphi 10.4.2拍照遇到的新问题
    ChinaCock 用CCShortcutBadger组件显示角标
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/7988665.html
Copyright © 2011-2022 走看看