2

最近、OpenGL について調べていて、テクスチャを使いたいという段階に来ました。シンプルな立方体のテクスチャリングから始めようと思いました。私は現在このコードを持っており、それがどのように機能するかを完全に理解しています:

#include <glut.h>

#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 400


float angle = 30.0f;

void Draw() {

  glLoadIdentity(); //Reset the drawing perspective
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clears the buffers

  //Add positioned light
  GLfloat lightColor0[] = {0.5f, 0.5f, 0.5f, 1.0f}; //Color intensity
  GLfloat lightPos0[] = {0.0f, 0.0f, 0.0f, 1.0f}; //Positioned at..
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0); //Set our light colour
  glLightfv(GL_LIGHT0, GL_POSITION, lightPos0); //Set our light position

  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 200);

  glRotatef(angle,1.0f,1.0f,1.0f); //Rotate around the origin
  glScalef(0.4f, 0.4f, 0.4f); //Scale the shape down
  glBegin(GL_QUADS); //Start drawing a Quad
  glColor3f(1.0f,0.0f,0.0f); //Set the colour to Red
  glVertex3f( 1.0f, 1.0f,-1.0f); //Top right of the quad (Top Face)
  glVertex3f(-1.0f, 1.0f,-1.0f); //Top left of the quad (Top Face)
  glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom left of the quad (Top Face)
  glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom right of the quad (Top Face)
  glVertex3f( 1.0f,-1.0f, 1.0f); //Top right of the quad (Bottom Face)
  glVertex3f(-1.0f,-1.0f, 1.0f); //Top left of the quad (Bottom Face)
  glVertex3f(-1.0f,-1.0f,-1.0f); //Bottom left of the quad (Bottom Face)
  glVertex3f( 1.0f,-1.0f,-1.0f); //Bottom right of the quad (Bottom Face)
  glVertex3f( 1.0f, 1.0f, 1.0f); //Top right of the quad (Front Face)
  glVertex3f(-1.0f, 1.0f, 1.0f); //Top left of the quad (Front Face)
  glVertex3f(-1.0f,-1.0f, 1.0f); //Bottom left of the quad (Front Face)
  glVertex3f( 1.0f,-1.0f, 1.0f); //Bottom right of the quad (Front Face)
  glVertex3f( 1.0f,-1.0f,-1.0f); //Top right of the quad (Back Face)
  glVertex3f(-1.0f,-1.0f,-1.0f); //Top left of the quad (Back Face)
  glVertex3f(-1.0f, 1.0f,-1.0f); //Bottom left of the quad (Back Face)
  glVertex3f( 1.0f, 1.0f,-1.0f); //Bottom right of the quad (Back Face)
  glVertex3f(-1.0f, 1.0f, 1.0f); //Top right of the quad (Left Face)
  glVertex3f(-1.0f, 1.0f,-1.0f); //Top left of the quad (Left Face)
  glVertex3f(-1.0f,-1.0f,-1.0f); //Bottom left of the quad (Left Face)
  glVertex3f(-1.0f,-1.0f, 1.0f); //Bottom right of the quad (Left Face)
  glVertex3f( 1.0f, 1.0f,-1.0f); //Top right of the quad (Right Face)
  glVertex3f( 1.0f, 1.0f, 1.0f); //Top left of the quad (Right Face)
  glVertex3f( 1.0f,-1.0f, 1.0f); //Bottom left of the quad (Right Face)
  glVertex3f( 1.0f,-1.0f,-1.0f); //Bottom right of the quad (Right Face)
  glEnd(); //Finished Drawing The Quad
  glutSwapBuffers(); //Send the 3D scene to the screen
}

void Update(int value){ //Our update function
  angle+=0.5f; //Increase the angle by 5

  if(angle>360){ //If the angle is greater than 360
    angle=0; //Set the angle to 0
  }

  glutPostRedisplay(); //Tell it that the scene has changed
  glutTimerFunc(25,Update,0); //Call "Update" again in another 25ms
}

void Initialize() {
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_LIGHTING); //Enable lighting
  glEnable(GL_LIGHT0); //Enable light No. 0
  glEnable(GL_NORMALIZE); //Automatically "normalize" normals
  glShadeModel(GL_SMOOTH); //Enable smooth shading (nice effect)  

  glClearColor(0.0, 0.0, 0.0, 0.0); //Background RGBA
  glMatrixMode(GL_MODELVIEW); //MODELVIEW view
  glLoadIdentity(); //Start at origin
  glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); //Set the scale
  //X axis = 0 to 1. Y = 0 to 1. Z = -1 to 1.
}

int main() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //The display mode
  glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); //Window Size
  glutInitWindowPosition(200, 200); //Window Position
  glutCreateWindow("Lighting!"); //Creates a window with the name "Lighting!"
  Initialize(); //Call our initialize function.
  glutDisplayFunc(Draw); //"Draw" then refresh the window
  glutTimerFunc(25,Update,0); //Call "Update" 25ms after program starts
  glutMainLoop(); //Process events etc. Also keeps the window open.
  return 0; //End the program
}

ただし、多くのテクスチャリングチュートリアルを読んだ後(文字通り、ウェブ上で見つけることができるすべてのものを意味します)。このプログラムにどのように追加するかについては、まだ混乱しています。キューブを描画する前に、(どういうわけか) テクスチャを読み込んで glBindTexture 関数を使用してバインドする必要があることはわかっていますが、その間に他に何かする必要があると思います (そして、読み込む方法がわかりません)。画像も適切に)。

4

5 に答える 5

3

テクスチャ ファイル (png、jpg...) をロードするには、これを使用します: (SDL および SDL_image ライブラリをインストールすることを忘れないでください)

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

GLuint texture_alloc(const char  *tex_name, int alpha)
{
    GLuint tex_num;

    SDL_Surface *tex_img;
    glGenTextures(1, &tex_num);

    if(tex_img = (SDL_Surface *) IMG_Load(tex_name)) {

        glBindTexture(GL_TEXTURE_2D, tex_num);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

        if (alpha==1)
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_img->w, tex_img->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_img->pixels);
        else
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_img->w, tex_img->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->pixels);
        SDL_FreeSurface (tex_img);
    }

    return tex_num;

}

テクスチャ座標を設定するには、glTexCoord 関数を使用します。

glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, 1.0f,-1.0f); 
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
.
.
.
于 2010-07-19T12:47:37.940 に答える
2

私が使用しているOpenGL画像読み込みライブラリであるSOILを確認することをお勧めします。

テクスチャを機能させる限り、そのほとんどは次のとおりです。

Unsigned int texture = SOIL_load_OGL_texture(imagePath.c_str(), SOIL_CREATE_NEW_ID, SOIL_LOAD_AUTO, SOIL_FLAG_MIPMAPS);

glBindTexture(texture);

ただし、openglがテクスチャをラップする方法を認識できるように、テクスチャ座標を使用する必要があります。キューブをレンダリングするいくつかのサンプル呼び出しを次に示します。

    int size = 1;

    // Begin Rending
    glBegin(GL_QUADS);

    {
        // Face 1

        glNormal3f( 0.0f, 0.0f, 1.0f);  

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( m_size, m_size,-m_size);

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

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-m_size, m_size, m_size);

        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( m_size, m_size, m_size);    

        // Face 2

        glNormal3f( 0.0f, 0.0f,-1.0f);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( m_size,-m_size, m_size);    

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

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-m_size,-m_size,-m_size);

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

        // Face 3


        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( m_size, m_size, m_size);    

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

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-m_size,-m_size, m_size);    

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

        // Face 4

        glNormal3f( 0.0f,-1.0f, 0.0f);  

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( m_size,-m_size,-m_size);

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

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-m_size, m_size,-m_size);

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

        // Face 5

        glNormal3f( 1.0f, 0.0f, 0.0f);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-m_size, m_size, m_size);    

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

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-m_size,-m_size,-m_size);

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

        // Face 6

        glNormal3f( 1.0f, 0.0f, 0.0f);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( m_size, m_size,-m_size);

        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( m_size, m_size, m_size);

        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( m_size,-m_size, m_size);

        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( m_size,-m_size,-m_size);    
    }

    glEnd();
于 2010-07-17T11:54:40.300 に答える
1

あなたの欠けている部分は、テクスチャ座標の概念だと思います。

テクスチャは 2D ですよね?したがって、オブジェクトの 3D ポイントをグラフィックス カードにプッシュするときに、テクスチャを適用する場合は、その 3D ポイントをテクスチャ イメージ内の位置に関連付ける必要があります。これは、テクスチャ座標のペアで行います (ペアのためテクスチャは 2D です)... glTexCoord2f() を見てください... glVertex3f() を呼び出す直前にそれを呼び出すと、その 3D ポイントを画像内のポイントに関連付けることができます...プリミティブopenglを構成するすべてのポイントに対してそれを行い、その間のすべてのポイントを補間できます...

于 2010-07-17T15:50:15.123 に答える
0

http://nehe.gamedeve.net/のglauxコードを使用できます。これも非常に簡単です。

AUX_RGBImageRec* LoadBMP(char* Filename)
{
    FILE *File = NULL;

    if ( !Filename )
        return NULL;

    File = fopen(Filename,"r");

    if ( !Filename )
        return NULL;

    fclose(File);
    return auxDIBImageLoad(Filename);
}

int LoadTextures()
{
    int Status = FALSE;
    AUX_RGBImageRec *TextureImage[1];
    memset(TextureImage,0,sizeof(void*)*1);

    if ( TextureImage[0] = LoadBMP("GoneFishing.bmp") )
    {
        Status = true;
        if(texture[0] == -1)
            glGenTextures(1,&texture[0]);
        glBindTexture(GL_TEXTURE_2D,texture[0]);
        // Generate The Texture
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering
    }

    if (TextureImage[0])                            // If Texture Exists
    {
        if (TextureImage[0]->data)                  // If Texture Image Exists
        {
            free(TextureImage[0]->data);                // Free The Texture Image Memory
        }

        free(TextureImage[0]);                      // Free The Image Structure
    }

    return Status;
}
于 2010-07-20T06:58:40.597 に答える
0

画像の読み込みには、SDL-image Library も使用できます。

http://www.libsdl.org/projects/SDL_image/

とても便利です。

于 2010-07-17T12:37:41.053 に答える