Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenGL纹理显示为实体对象?_C_Opengl_Colors_Textures_Rendering - Fatal编程技术网

C OpenGL纹理显示为实体对象?

C OpenGL纹理显示为实体对象?,c,opengl,colors,textures,rendering,C,Opengl,Colors,Textures,Rendering,因此,据我所知,我已经正确加载了我的纹理,因为我正在制作的一张桌子使用了不同色调的棕色,这张桌子使用了两种不同的纹理。然而,纹理显示为纯色,没有细节。 我不知道是什么原因造成的 这是我加载bmp纹理的代码: GLuint LoadTexture(const char * filename){ GLuint texture; int width, height; unsigned char * data; FILE * file; file = fopen(filename, "rb");

因此,据我所知,我已经正确加载了我的纹理,因为我正在制作的一张桌子使用了不同色调的棕色,这张桌子使用了两种不同的纹理。然而,纹理显示为纯色,没有细节。 我不知道是什么原因造成的

这是我加载bmp纹理的代码:

GLuint LoadTexture(const char * filename){
GLuint texture;

int width, height;

unsigned char * data;

FILE * file;

file = fopen(filename, "rb");

if(file == NULL)
    return 0;
width = 512;
height = 1024;
data = (unsigned char *) malloc (width * height * 3);

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

for(int i = 0; i < width * height; ++i){
    int index = i * 3;
    unsigned char B,R;
    B = data[index];
    R = data[index + 2];

    data[index] = R;
    data[index + 2] = B;
}

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,width, height, GL_RGB, GL_UNSIGNED_BYTE, data);

return texture;
}

void loadTextures(){
tableTopTexture = LoadTexture("table_top.bmp");
tableLegTexture = LoadTexture("table_leg.bmp");
}

以下是完整代码的粘贴箱:

在每个
glVertex3f()
之前,您需要一个
glTexCoord2f()


否则,多个顶点将具有相同的texcoord,从而导致从纹理中采样单一颜色。

这不是纹理坐标的工作方式。@genpfault是的,我对它们的工作方式有点困惑。它到底是如何工作的?在每次
glVertex3f()
之前,您都需要一个
glTexCoord2f()
。我应该如何用我的方式处理它?我有一个drawCube,这就是我创建所有对象的方式。是的,我认为我做的TexCoords是错误的。在每个drawCube之前我能打6个texCoord电话吗?还是必须在drawCube中?我使用drawCube创建每个对象,所以我不确定如何最好地进行。我的意思是,我可以指定drawCube中的所有GltexCoord2F,并将我希望它使用的纹理传递给drawCube吗?@AndyOHart:想象一下glTexCoord和glVertex是这样的:
glTexCoord(tc){tc_state=tc;}
glVertex(vp){send_vertex_to_GPU(vp,tc_state)}
——我想你知道这意味着什么。老实说,您根本不应该使用即时模式(glBegin、glVertex)。使用顶点数组;如果你一开始就用VAs的话,你就不会掉进那个陷阱了。啊,好的,谢谢你的解释,我会考虑改变它的
void drawTable(){

//texture stuff
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);



//draw legs
glBindTexture(GL_TEXTURE_2D, tableLegTexture);
glTexCoord2f(0.0,0.0);
drawCube(0.050,0.5,0.060,0,0,0);
glTexCoord2f(0.0,1.0);
drawCube(0.050,0.5,0.060,3,0,0);
glTexCoord2f(1.0,1.0);
drawCube(0.050,0.5,0.060,3,0,-1);
glTexCoord2f(1.0,0.0);
drawCube(0.050,0.5,0.060,0,0,-1);

//draw table top
glBindTexture(GL_TEXTURE_2D, tableTopTexture);
glTexCoord2f(0.0,0.0);
glTexCoord2f(1.0,0.0);
glTexCoord2f(1.0,1.0);
glTexCoord2f(0.0,1.0);
drawCube(2,0.050,1,1.5,0.5,-0.5);

glDisable(GL_TEXTURE_2D);
}