0

首先,我尝试读取 ppm 文件并将其用于我的纹理,但是我不确定这是否是我的问题所在(在读取文件时)。所以我硬编码了一个小的 4x4 图像(随机颜色)并使用它。我仍然无法让它工作。有没有人有任何见解?

data2, x2, y2 都是硬编码的图像属性。

glPushMatrix();

    FILE *inFile;
    char dump[3];
    int max, k = 0;

    inFile = fopen("mountains.ppm", "r");
    int x;
    int y;

        fscanf(inFile, "%s", dump);
        //printf("%s", dump);
        fscanf(inFile, "%d %d", &x, &y);


        fscanf(inFile, "%d", &max);
        int arraySize = y*(3*x);
        int data[arraySize];

        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                fscanf(inFile, "%d", &data[k++]);
                fscanf(inFile, "%d", &data[k++]);
                fscanf(inFile, "%d", &data[k++]);
            }
        }

    int data2[] = { 100 , 50, 50, 40,  30,  70, 70, 30, 40, 155, 50, 215,
                     50 , 40, 30, 60,  15,  77, 70, 70, 70,  70, 70,  70,
                     50 , 40, 30, 20, 110, 210, 20, 15, 47,  40, 40,  30,
                     15 , 40, 15, 40,  30,  40, 30, 20, 80,  80, 40,  20};

    int x2 = 4;
    int y2 = 4;


    fclose(inFile);

        glGenTextures(1,&texture);
        glBindTexture(GL_TEXTURE_2D,texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);           

        gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2);

    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
    glBindTexture(GL_TEXTURE_2D,texture);

    glTexCoord2d(0,0); glVertex3f(0,0.0,0);
    glTexCoord2d(0,1); glVertex3f(0,0.0,80);
    glTexCoord2d(1,1); glVertex3f(80,0.0,80);
    glTexCoord2d(1,0); glVertex3f(80,0.0,0);
    glDisable(GL_TEXTURE_2D);  

glPopMatrix();  
4

1 回答 1

5

首先,纹理加载不是你应该每帧都做的事情。您创建一次纹理,然后在需要使用该纹理进行渲染时使用它。所以你需要从渲染逻辑中获取纹理加载代码。

下一个:

gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2);

data2是 的数组int,通常大小为 4 个字节。但是你告诉 OpenGL 假设数据的每三个字节是一个像素,第一个字节是红色,第二个是绿色,等等。但是你的红色值是 4 个字节。因此 OpenGL 无法正确获取数据。

您想要的是定义data2GLubyte数组,而不是int数组。

此外,永远不要使用数字作为图像格式(第二个参数)。我不在乎规范说它是合法的。只需使用真实格式。使用GL_RGB8而不是“3”。

最后:

glTexCoord2d(0,0); glVertex3f(0,0.0,0);
glTexCoord2d(0,1); glVertex3f(0,0.0,80);
glTexCoord2d(1,1); glVertex3f(80,0.0,80);
glTexCoord2d(1,0); glVertex3f(80,0.0,0);

这几乎没有任何作用。没有它glBegin()/glEnd()周围,你只是设置一些状态值。实际上,调用glVertex*一对之外的任何命令都会glBegin()/glEnd()导致未定义的行为。它当然不会导致渲染(或者如果确实如此,它将没有任何用处)。

顺便说一句,你会发现如果你总是从工作代码开始,你会更有效率。例如,如果你想玩纹理,先做你知道的事情:画一个没有纹理的形状。一旦你有这个工作,你知道如果有什么东西坏了,那完全是因为你的纹理代码。

于 2011-12-02T19:13:21.270 回答