OpenGL中的MipMap纹理

OpenGL中的MipMap纹理,opengl,textures,glut,mipmaps,Opengl,Textures,Glut,Mipmaps,首先,我尝试读取ppm文件并将其用于纹理,但我不确定这是否是我的问题所在(读取文件)。所以我硬编码了一个小的4x4图像(随机颜色)并使用了它。我还是不能让它工作。有人有什么见解吗 数据2、x2、y2都是硬编码图像属性 glPushMatrix(); FILE *inFile; char dump[3]; int max, k = 0; inFile = fopen("mountains.ppm", "r"); int x; int y;

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

数据2、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();  
glPushMatrix();
文件*填充;
字符转储[3];
int max,k=0;
infle=fopen(“山脉,百万分之一,r”);
int x;
int-y;
fscanf(填充,“%s”,转储);
//printf(“%s”,转储);
fscanf(填充、%d%d、&x和&y);
fscanf(填充、%d、&max);
int arraySize=y*(3*x);
int数据[arraySize];
对于(int i=0;i
首先,纹理加载不是每帧都应该做的事情。创建一次纹理,然后在需要使用该纹理进行渲染时使用它。因此,需要从渲染逻辑中获取纹理加载代码

下一步:

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

您需要将
data2
定义为
GLubyte
数组,而不是
int
数组

此外,切勿将数字用于(第二个参数)。我不在乎说明书上说它是合法的;只需使用真正的格式。使用
GL\u 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()
,您只需设置一些状态值。实际上,在
glBegin()/glEnd()
对之外调用任何
glVertex*
命令都会导致未定义的行为。它当然不会导致渲染(或者,如果确实如此,它将不会有任何用处)


另一方面,如果总是从工作代码开始,您会发现您的工作效率会更高。例如,如果您想使用纹理,请从您所知道的开始:绘制一个未设置纹理的形状。一旦你开始工作,你就知道如果有东西坏了,那完全是因为你的纹理代码。

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

下一步:

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

您需要将
data2
定义为
GLubyte
数组,而不是
int
数组

此外,切勿将数字用于(第二个参数)。我不在乎说明书上说它是合法的;只需使用真正的格式。使用
GL\u 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()
,您只需设置一些状态值。实际上,在
glBegin()/glEnd()
对之外调用任何
glVertex*
命令都会导致未定义的行为。它当然不会导致渲染(或者,如果确实如此,它将不会有任何用处)


另一方面,如果总是从工作代码开始,您会发现您的工作效率会更高。例如,如果您想使用纹理,请从您所知道的开始:绘制一个未设置纹理的形状。一旦你开始工作,你就知道如果有东西坏了,那完全是因为你的纹理代码。

你能给我们描述一下你的行为吗?它是否显示一个未设置结构的四边形,是否完全不显示任何内容?此外,在这段代码之外是否有任何矩阵操作?就目前情况而言,似乎四元体不会出现在视野中。“我仍然无法让它工作”,你的意思是…?对不起,我的意思是什么都不会出现。是的,我设置了一个视图和所有东西。我只是觉得如果我把它都包括在这里,代码会变得冗长。我只是把我认为可能很重要的部分包括进去。@genpfault,哈哈,你为什么要删掉我的“提前感谢”?只是好奇。你能给我们描述一下你的行为吗?它是否显示一个未设置结构的四边形,是否完全不显示任何内容?还有,有矩阵m吗