C ++ OpenGL在GL_QUAD中加载图像,glVertex2f

时间:2011-01-04 21:16:17

标签: c++ visual-c++ opengl

使用WIN32_FIND_DATAFindFirstFile我在fileName.find(".jpg") != std::string::npos目录中搜索文件我将jpg图像过滤掉。

我正在使用OpenGL创建红色框:

glBegin( GL_QUADS );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( 0.35f, 0.7f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( -0.35f, 0.7f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( -0.35f, -0.3f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( 0.35f, -0.3f );

这是中心的红色框。

我的问题是如何在多维数据集中加载图像而不是红色(glColor4f)?

我认为这不是制作此功能的最佳方法,但这段代码不是我自己的代码,我正在尝试为朋友做得更好。

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要了解纹理。请参阅主题NeHe's tutorial作为示例。

然而,该教程有点旧(因为你的代码,因为你使用glVertex(),所以它现在对你来说可能没关系...... :)。

无论如何,从OpenGL 3.1和OpenGL ES 2.0开始,您应该使用GLSL,片段着色器和采样器来完成。请参阅another tutorial。它实际上比学习所有固定功能的东西更简单。

答案 1 :(得分:0)

将WinAPI与OpenGL应用程序一起使用并不是一个好习惯,除非你真的有理由 - 并且从磁盘加载纹理不是一个好理由。

这样想:OpenGL是一个独立于平台的API,为什么在存在便携式替代方案时使用非便携式子程序来消除这种优势在大多数情况下更方便使用?


对于加载纹理,我建议使用 SOIL 库。这可能比NeHe教程推荐的解决方案好得多。

要查找磁盘上的文件,如果要摆脱WinAPI依赖关系,可能需要使用 boost::filesystem 。但现在这不是优先事项。


当您通过SOIL加载纹理(GLuint值是纹理ID)时,您可以执行以下操作:

  • 启用2D纹理(glEnable(GL_TEXTURE_2D)),
  • 将纹理绑定为活动的2D纹理(glBindTexture(GL_TEXTURE_2D,tex);),
  • 将活动颜色设置为纯白色,使纹理图像全亮,
  • 像往常一样绘制顶点,但是对于每个顶点,您需要指定纹理坐标(glTexCoord2f)而不是颜色。 (0,0)是纹理图像的左上角坐标,(1,1)是右下角。

请注意,纹理图像必须具有维度为2的幂(例如16x16或256x512)。如果要使用任何纹理大小,请切换到支持GL_TEXTURE_RECTANGLE的较新OpenGL版本。

就基础知识而言,并不是很多解释。 :)

对于马库斯在答案中所说的话,顺便说一下BTW- +1。你现在正在学习一个过时的OpenGL版本;虽然你可以用它做很多有趣的事情,你可以用至少 OpenGL 2和着色器做更多的事情......而且使用着色器通常也更容易。