使用土壤加载 .png 纹理,问题

Posted

技术标签:

【中文标题】使用土壤加载 .png 纹理,问题【英文标题】:load .png texture using soil, issue 【发布时间】:2016-01-10 14:17:09 【问题描述】:

大家好,我是 OpenGL 的新手,在尝试显示纹理时遇到问题。我尝试以 .png 格式显示的每个纹理都只是赋予其颜色,例如,如果我尝试显示红色砖它只是出现红色,只有颜色。我使用的代码如下。我应该在哪里绑定纹理或代码有什么问题?看不懂。

GLuint LoadTexture(const char * filename, int width, int height)
GLuint texture_id;
unsigned char *data;

    texture_id = SOIL_load_OGL_texture(filename,
    4, 0, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS |   SOIL_FLAG_INVERT_Y);

if (texture_id == 0)

    printf( "SOIL loading error: '%s'\n", SOIL_last_result() );



glBindTexture(GL_TEXTURE_2D, texture_id);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_DECAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_DECAL);
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);


void display()

 glClearColor(0, 0, 0, 1);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glEnable(GL_TEXTURE_2D);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 int w = glutGet(GLUT_WINDOW_WIDTH);
 int h = glutGet(GLUT_WINDOW_HEIGHT);
 gluPerspective(60, w / h, 0.1, 100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3, 3, 3,
          0, 0, 0,
          0, 0, 1);

glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);

glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);
mycube();
glutSwapBuffers();


int main(int argc, char **argv)


glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(640, 480);
glutCreateWindow("CUBE");
texture = LoadTexture("texture.png", 256, 256);
glutDisplayFunc(display);
glutSpecialFunc(specialKeys);
glEnable(GLUT_DEPTH);


glutMainLoop();
FreeTexture(texture);

return 0;

【问题讨论】:

您需要提供 tex 坐标。 GL_DECAL 不是GL_TEXTURE_MAG_FILTER/GL_TEXTURE_MIN_FILTER 的可能枚举之一。查看the documentation 以获得正确的选项。 【参考方案1】:

我没有看到您的 LoadTexture() 函数的来源。可以做的一件事是创建一个结构,该结构保存 OpenGL 在绑定到可渲染对象时为纹理设置的 id 值、其宽度和高度(以像素为单位)、颜色位深度信息和颜色数据(如果有)包含透明胶片,应包装或重复,并且使用的 mipmap 质量。我不知道您使用什么来打开、读取和解析 png 文件,但在我自己的项目中,我碰巧使用了 libpng。

【讨论】:

以上是关于使用土壤加载 .png 纹理,问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL ES 2.0 中使用 png 图像纹理立方体?

使用 Boost.GIL 加载 opengl 纹理

如何使用 libgdx 资产管理器正确加载纹理

Metal之加载TGA与PNG/JPEG纹理图片

THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材

OpenGL在2个纹理之间切换