纹理未出现在屏幕 Opengl 上
Texture not appearing on the screen Opengl
我想在背景上加载图像,我编写了以下代码通过对矩形进行纹理化来加载纹理作为背景。我的图像是 2 的幂 (512x512)。我不明白为什么它没有在屏幕上显示任何内容,
请帮帮我。
我正在粘贴我的代码以加载纹理并绘制矩形。
此外,我使用 SOIL_last_result() 检查图像是否正确加载,并使用 glGetError()
使用 SOIL 将图像加载为纹理的代码
void loadTexture(GLuint* texture, char* path){
*texture = SOIL_load_OGL_texture(path,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_MULTIPLY_ALPHA
);
cout<<*texture<<endl;
if(*texture == NULL){
printf("Failed to load %s", path);
}
}
下面的代码是绘制纹理和矩形,
void drawRect(int x, int y, int w, int h, GLuint texture){
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glColor3f(1.0,1.0,1.0);
glBegin(GL_POLYGON);
glTexCoord2i(0,0);
glVertex2i(x,y);
glTexCoord2i(1,0);
glVertex2i(x+w,y);
glTexCoord2i(0,1);
glVertex2i(x,y+h);
glTexCoord2i(1,1);
glVertex2i(x+w,y+h);
glEnd();
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
}
我使用初始化方法调用它,
void initGL(void)
{
glClearDepth(1.0);
glClearColor(0,0,0, 1.0f);
glColor3f(0.0, 0.0, 0.0);
glLineWidth(1);
glDepthFunc(GL_LESS);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLuint texture;
loadTexture(&texture, "image.png");
drawRect(0,0,screen_width-100,screen_height-100,texture);
glfwSwapBuffers(window);
}
请帮助我,如果您需要更多信息,请告诉我。
提前致谢!!
投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。它从眼睛 space 变换到剪辑 space,并且剪辑 space 中的坐标通过除以剪辑坐标。 NDC 的范围为 (-1,-1,-1) 到 (1,1,1)。
超出剪辑 space 的每个几何体都被剪辑。
由于你没有设置投影矩阵,所以你的投影矩阵就是单位矩阵。这意味着您只会 "see" 坐标在 -1 到 1 范围内的几何体。
我建议设置正交投影矩阵 (glOrtho
)。在正交投影中,眼睛中的坐标 space 线性映射到归一化设备坐标,剪辑空间坐标等于归一化设备坐标。
像这样设置投影:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screen_width, 0, screen_height, -1, 1);
我想在背景上加载图像,我编写了以下代码通过对矩形进行纹理化来加载纹理作为背景。我的图像是 2 的幂 (512x512)。我不明白为什么它没有在屏幕上显示任何内容,
请帮帮我。 我正在粘贴我的代码以加载纹理并绘制矩形。
此外,我使用 SOIL_last_result() 检查图像是否正确加载,并使用 glGetError()
使用 SOIL 将图像加载为纹理的代码
void loadTexture(GLuint* texture, char* path){
*texture = SOIL_load_OGL_texture(path,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_MULTIPLY_ALPHA
);
cout<<*texture<<endl;
if(*texture == NULL){
printf("Failed to load %s", path);
}
}
下面的代码是绘制纹理和矩形,
void drawRect(int x, int y, int w, int h, GLuint texture){
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glColor3f(1.0,1.0,1.0);
glBegin(GL_POLYGON);
glTexCoord2i(0,0);
glVertex2i(x,y);
glTexCoord2i(1,0);
glVertex2i(x+w,y);
glTexCoord2i(0,1);
glVertex2i(x,y+h);
glTexCoord2i(1,1);
glVertex2i(x+w,y+h);
glEnd();
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
}
我使用初始化方法调用它,
void initGL(void)
{
glClearDepth(1.0);
glClearColor(0,0,0, 1.0f);
glColor3f(0.0, 0.0, 0.0);
glLineWidth(1);
glDepthFunc(GL_LESS);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLuint texture;
loadTexture(&texture, "image.png");
drawRect(0,0,screen_width-100,screen_height-100,texture);
glfwSwapBuffers(window);
}
请帮助我,如果您需要更多信息,请告诉我。 提前致谢!!
投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。它从眼睛 space 变换到剪辑 space,并且剪辑 space 中的坐标通过除以剪辑坐标。 NDC 的范围为 (-1,-1,-1) 到 (1,1,1)。
超出剪辑 space 的每个几何体都被剪辑。
由于你没有设置投影矩阵,所以你的投影矩阵就是单位矩阵。这意味着您只会 "see" 坐标在 -1 到 1 范围内的几何体。
我建议设置正交投影矩阵 (glOrtho
)。在正交投影中,眼睛中的坐标 space 线性映射到归一化设备坐标,剪辑空间坐标等于归一化设备坐标。
像这样设置投影:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screen_width, 0, screen_height, -1, 1);