2013-03-07 121 views
0

在OpenGL中生成纹理时,GL_REPEAT和GL_CLAMP出现问题。在我的下面的代码中,我得到了与GL_REPEAT和GL_CLAMP相同的结果(它始终重复)...我没有看到我的代码与许多教程中的代码有任何区别。请帮我找到这个错误。我试图从4增加图像尺寸,直到128 ..但仍然GL_CLAMP和GL_REPEATGL_REPEAT和GL_CLAMP给出相同的结果

之间没有区别
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

#include <cmath> 
#include <stdlib.h> 
#include <stdio.h> 

/* Create checkerboard texture */ 
#define checkImageWidth 64 
#define checkImageHeight 64 
static float checkImage[checkImageHeight][checkImageWidth][4]; 

static GLuint texName; 

void makeCheckImage(void) 
{ 
    int i, j; 
    float c; 

    for (i = 0; i < checkImageHeight; i++) { 
     for (j = 0; j < checkImageWidth; j++) { 
//   c = ((((i&0x8)==0)^((j&0x8))==0))*255; 
      c = 10*sin(i*j); 
//   checkImage[i][j][0] = (GLubyte) c*0; 
     checkImage[i][j][0] = c*0.1; 
     checkImage[i][j][1] = c*0.25; 
     checkImage[i][j][2] = c*0.0; 
     checkImage[i][j][3] = 250; 
     } 
    } 
} 

void init(void) 
{  
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    glEnable(GL_DEPTH_TEST); 

    makeCheckImage(); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glGenTextures(1, &texName); 
    glBindTexture(GL_TEXTURE_2D, texName); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
        GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, 
       checkImageHeight, 0, GL_RGBA, GL_FLOAT, 
       checkImage); 
} 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    gluLookAt(1, -1, 1, 0, 1, 0, 0, 0, 1); 
    glEnable(GL_TEXTURE_2D); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
    glBindTexture(GL_TEXTURE_2D, texName); 
    glMatrixMode(GL_MODELVIEW); 
    //glLoadIdentity(); 

    // glLoadIdentity(); 
    glPushMatrix(); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); 
    glTexCoord2f(1.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, 1.0); glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); 
    glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -2.0, -1.41421); 

    glPopMatrix(); 


    glPushMatrix(); 
    /* 
    glTranslated(-6, -2, 1); 
    glScaled(0.5,0.5,0.5) ; 
    //GLint mysphereID; 
    GLUquadricObj *sphere=NULL; 
    sphere = gluNewQuadric(); 
    gluQuadricDrawStyle(sphere, GLU_LINE); 
    gluQuadricTexture(sphere, GL_TRUE); 
    gluQuadricNormals(sphere, GLU_SMOOTH); 
    gluSphere(sphere, 01.0, 100, 100); 
*/ 
    glPopMatrix(); 

    glPushMatrix(); 

    glColor3f(0.7f, 0.0f, 0.4f); 
    glTranslated(-1, -3, -1); 
    glScaled(0.5,0.5,0.5) ; 
    GLUquadricObj *quadObj = gluNewQuadric(); 
    gluQuadricDrawStyle(quadObj, GLU_LINE); 
     gluQuadricNormals(quadObj, GLU_SMOOTH); 
     gluQuadricTexture(quadObj, GL_TRUE); 
    gluCylinder(quadObj, 0.8, 0.8, 1.4, 100, 100); 

    glPopMatrix(); 

    glDisable(GL_TEXTURE_2D); 
    //gluDeleteQuadric(sphere); 
    gluDeleteQuadric(quadObj); 


    glEnd(); 
    glFlush(); 

} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(100.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 27: 
     exit(0); 
     break; 
     default: 
     break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    //glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(550, 550); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow(argv[0]); 
    init(); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
    return 0; 
} 

回答

2

,你不会看到一个区别,除非你的纹理坐标范围为0以外的1,否则没有什么夹紧或重复。

+0

谢谢你的回应..在我上面发布的代码中...如何使纹理超出范围0到1 ...? – AdityaG 2013-03-07 18:36:19

+0

将更大的数字放在对glTexCoord2f()的调用中。 – JasonD 2013-03-07 18:39:26

+0

这就像是魅力......谢谢.... – AdityaG 2013-03-07 18:45:46

相关问题