jai*_*esh 0 opengl glut textures mipmaps
首先,我尝试读取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();
Run Code Online (Sandbox Code Playgroud)
首先,纹理加载不是你应该每帧都做的事情.您可以创建一次纹理,然后在需要使用该纹理进行渲染时使用它.所以你需要从渲染逻辑中获取纹理加载代码.
下一个:
gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2);
Run Code Online (Sandbox Code Playgroud)
data2是一个数组int,通常是4个字节的大小.但是你告诉OpenGL假设数据的每三个字节都是一个像素,第一个字节是红色,第二个字节是绿色等等.但是你的红色值是4个字节.因此OpenGL无法正确获取数据.
你想要的是定义data2为GLubyte数组,而不是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);
Run Code Online (Sandbox Code Playgroud)
这几乎没有任何作用.没有glBegin()/glEnd()它,你只是设置一些状态值.实际上,调用一glVertex*对外的任何命令都会glBegin()/glEnd()导致未定义的行为.它肯定不会导致渲染(或者如果它渲染,它将没有任何用处).
顺便说一句,如果你总是从工作代码开始,你会发现你会更有效率.例如,如果你想玩纹理,首先要做你所知道的:绘制一个无纹理的形状.一旦你有了这个工作,你知道如果出现问题,那将完全是因为你的纹理代码.