【问题标题】:OpenGL texture mapping coordinatesOpenGL纹理映射坐标
【发布时间】:2012-01-25 00:09:25
【问题描述】:

我需要能够在整个 2d 或 3d(面部)形状上拉伸我正在导入的图像纹理。它只会在形状的右上角呈现,然后重复 - 如果我启用 GL_REPEAT,或者如果我启用 GL_CLAMP,图像将从投影到边缘的侧面可怕地拉伸。

这是我的代码:

#include "stdafx.h"
#include "glut.h"
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>



GLuint texture;
float xRotation = 0.0f;




void drawScene1 (void) {
    //glRotatef(xRotation,0.0f,1.0f,0.0f);
    glBindTexture(GL_TEXTURE_2D, texture);
    //glutSolidCube(1.0f);

    glBegin(GL_POLYGON);
        glTexCoord2d(0,1);
        glVertex2d(-1.5,-1.5);

        glTexCoord2d(1,1);
        glVertex2d(1.0,-2.0);

        glTexCoord2d(1,0);
        glVertex2d(+1.5,+1.5);

        glTexCoord2d(0,0);
        glVertex2d(-1.5,+1.5);
    glEnd();
}




void FreeTexture(GLuint texture) {
  glDeleteTextures(1, &texture);
}



GLuint LoadTexture(const char * filename, int width, int height) {

    GLuint texture;
    unsigned char * data;
    FILE * file;

    file = fopen(filename, "rb");
    if ( file == NULL ) return 0;
    data = (unsigned char *)malloc(width * height * 3);

    fread(data, width * height * 3, 1, file); 
    fclose(file);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

    //glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);


    free(data);
    return texture;
}




void init (void) {
    glShadeModel(GL_SMOOTH);  
    glMatrixMode(GL_PROJECTION);
    //glLoadIdentity();
    //gluOrtho2D(0,500,0,500);
    //glClearDepth(1);
    //glEnable (GL_DEPTH_TEST);
    //glEnable (GL_LIGHTING);
    //glEnable (GL_LIGHT0);
    //glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_NORMALIZE);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);

}




void display (void) {
    glClearColor(0.05,0.05,0.1,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    texture = LoadTexture("img.raw", 256, 256);

    drawScene1();

    FreeTexture(texture);
    glutSwapBuffers();
    xRotation++;
}



int main (int argc, char **argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Virgin");
    init();
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
    return 0;
}

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    请决定:隐式纹理坐标生成:

    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    

    或显式纹理坐标请求:

    glTexCoord(...)
    

    隐式将覆盖显式。


    void display (void) {
    /*... */
        texture = LoadTexture("img.raw", 256, 256);
    
        drawScene1();
    
        FreeTexture(texture);
    /* ... */
    }
    

    不要为每个渲染帧加载和删除纹理。启动时加载纹理,仅在渲染时绑定它们。

    【讨论】:

      【解决方案2】:

      删除以下行:

      glEnable(GL_TEXTURE_GEN_S);
      glEnable(GL_TEXTURE_GEN_T);
      

      您已经通过 glTexCoord2f() 输入了纹理坐标,无需生成它们。

      【讨论】:

        猜你喜欢
        • 2012-08-31
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2011-05-04
        • 2011-03-16
        • 1970-01-01
        • 2011-08-25
        • 2012-07-28
        相关资源
        最近更新 更多