如何对四边形应用纹理以对立方体进行纹理处理? [英] How to apply textures to a quad in order to texture a cube?

查看:112
本文介绍了如何对四边形应用纹理以对立方体进行纹理处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近,我一直在研究OpenGL,并且我已经达到了要纹理化的阶段.我以为我将从构造一个简单的多维数据集开始. 我目前有这段代码,并且完全理解了它的工作原理:

Recently I have been looking into OpenGL, and I've got up to the stage were I want to texture things. I thought I would start with texturing a simple cube. I currently have this code, and understand fully how it works:

#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函数将其绑定,但是我认为中间还需要做一些其他事情(而且我不知道如何加载)图像也正确).

However after reading many, MANY texturing tutorials (I mean literally all of the ones I could find on the web); I'm still confused about how I would add it to this program. I know that I have to load the texture (somehow) and then bind it using the glBindTexture function before I draw the cube, but I think there is something else I need to do in-between (and I don't know how to load the image properly either).

推荐答案

要加载纹理文件(png,jpg ...),请使用以下命令: (不要忘记安装SDL和SDL_image库)

For loading texture files (png, jpg...) use this: (don't forget to install SDL and SDL_image libraries)

#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函数:

For setting texture coordinates use glTexCoord function:

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

这篇关于如何对四边形应用纹理以对立方体进行纹理处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆