问题

我正在尝试找出 OpenGL 中的纹理映射,但我找不到一个简单的例子来工作。

正在绘制多边形,虽然它没有纹理,而只是纯色。此外,位图也被正确加载到 sprite1[] 中,因为到目前为止我一直在成功使用 glDrawPixels。

我使用 glGenTextures 来获取我的 tex 名称,但我注意到它并没有改变 texName1; 这个 GLuint 是我初始化它的任何东西,即使在调用 glGenTextures 之后……

我已启用 GL_TEXTURE_2D。

继承人的代码:

<span style="color:#003b61"><span style="background-color:#ffffff"><code class="language-cpp">GLuint texName1 = 0;glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
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_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);glTexCoord2f (0.0, 0.0);glVertex3f (0.0, 0.0, -5.0f);glTexCoord2f (1.0, 0.0);glVertex3f (.5, 0.0, -5.0f);glTexCoord2f (1.0, 1.0);glVertex3f (.5, .5, -5.0f);glTexCoord2f (0.0, 1.0);glVertex3f (0.0, .5, -5.0f);
glEnd();
</code></span></span>

更新:我不知所措。这是我尝试过的所有内容:

  1. 原来我是在初始化 OGL 之前初始化我的纹理。纹理在类构造函数中初始化(glGenTextures->glTexImage2D)并在每帧调用的成员函数中绘制(glBegin->glEnd)。genTextures 现在似乎工作正常,我的名字是 1。

  2. GL_RGBA8、GL_BGRA_EXT 的所有可能组合(GL_BGRA 在我的系统上不起作用;我需要 _EXT),我什至从位图中删除了 alpha 通道并尝试了 GL_RGB、GL_BGR_EXT 等的所有组合。没有运气。

  3. 尝试以程序方式创建位图并使用它

  4. 确保 GL_COLOR_MATERIAL 未启用。

  5. 将位图大小更改为 32×32。

  6. 尝试了 glTexEnvi 而不是 glTexEnvf。

解决方法

要检查的第一件事是颜色材料设置,如 ShadowIce 所述,然后检查您的纹理文件以确保其大小合理(例如 256×256)和 RGB 位图。如果文件有轻微的问题,无论您如何尝试,它都不会正确呈现。

然后,我将停止尝试仅调试该代码,而是查看您与 NeHe 网站上的教程有什么不同。

NeHe 始终是检查您是否尝试在 OpenGL 中做事的好地方。纹理可能是最难做到的事情,而且随着你其他 GL 技能的提高,它们只会变得更加困难。

我的 OpenGL 生锈了,但我记得与glTexImage2D
. 最后我设法让它工作,但我总是有更多的运气, gluBuild2DMipmaps
所以我最终得到了

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">gluBuild2DMipmaps (GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);
</code></span></span>

取代

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">glTexImage2D (GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data
);</code></span></span>

一些随机的想法:

  • GL_COLOR_MATERIAL 可能已启用
  • 将“glTexEnvf”更改为“glTexEnvi”,看看是否有帮助
  • 如果在 glGenTextures 之后 texName1 为 0,您可能没有活动的 OpenGL 上下文

对于错误检查,我建议编写一个小函数,打印来自 glGetErrors 的最常见结果的可读输出,并使用它来查找产生错误的行。另一种可能性是使用GLIntercept、BuGLe或gDEBugger之类的东西。

除了mentat 指出您可能对非二次幂纹理尺寸有问题之外,您还提到纹理名称生成不会更改名称。

这听起来好像您调用glGenTextures()得太早了,即在初始化 OpenGL 之前。如果你不是,那么我建议在调用glGenTextures()检查 OpenGL 错误状态之后添加代码,方法是调用glGetError().

文章来源:简单的 OpenGL 纹理贴图不起作用?

简单的 OpenGL 纹理贴图不起作用?相关推荐

  1. C++ Opengl纹理贴图源码

    C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  2. OpenGL 纹理贴图

    纹理贴图允许把一幅砖墙图像映射到一个多边形的表面上,并把正面墙画成单个多边形.纹理贴图能够保证当这个多边形变形或渲染时,映射到多边形表面的图像也能够表现出正确的行为. 纹理贴图是一个相当大的主题,并且 ...

  3. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  4. Qt5.6.0+OpenGL 纹理贴图首战告捷

    重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...

  5. C++写纹理贴图中OBJ文件和MTL(材质)文件

    在VTK 或者Opengl纹理贴图中都会用到模型文件,当使用vtkOBJImporter函数读取模型数据时,需要对应的MTL文件才能实现纹理贴图,但是网上大多数的OBJ文件和MTL文件都是由模型软件导 ...

  6. OpenGL ES教程VI之纹理贴图(原文对照)

    注:又是一篇,是否有人能解释得清楚,2是重复两次,那么是否N就是重复N次呢?接近1.0的坐标值整数部分加上几就是重复几次吗?这个好像之前验证过不一定的. 转自:http://melord.iteye. ...

  7. opengl生成图片php,(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片...

    转:http://blog.csdn.net/junzia/article/details/52842816 前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一 ...

  8. 计算机图形学与opengl C++版 学习笔记 第5章 纹理贴图

    目录 5.1 加载纹理图像文件 5.2 纹理坐标 5.3 创建纹理对象 5.4 构建纹理坐标 5.5 将纹理坐标载入缓冲区 5.6 在着色器中使用纹理:采样器变量和纹理单元 5.7 纹理贴图:示例程序 ...

  9. OpenGL 纹理过滤和 mip 贴图

    一.概念 1. 纹理过滤 当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤. 纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXT ...

  10. openCV读入图片,openGL实现纹理贴图

    本文结合结合openCV,openGL的优点,实现混合编程. (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便: (2)OpenGL是跨平台的图形程序接口,它用于二维,三维 ...

最新文章

  1. 离散制造业的数据采集之路
  2. 【jquery版.net控件—dropdownlist】附源码,欢迎大家指点、指正、拍砖!!!
  3. webpack --- 使用vue
  4. Eclipse Java EE 开发 Web 应用程序
  5. 软件工程 敏捷的酒后问答
  6. linux sudo 命令权限,linux su和sudo命令的区别
  7. VBS操作 PDF时,常用快捷键(Adobe Acrobat Reader)
  8. apollo本地启动调方式
  9. R语言包下载(转载)
  10. echarts的tooltip提示框
  11. 01-12.产品经理入门到精通(一)
  12. java高并发解决方案
  13. 2寸照片尺寸大小是多少,两寸照片多大?
  14. 什么样的网页适合使用框架
  15. 如何管理一盘散沙的团队?
  16. Semantic UI学习(一、开始使用)
  17. 微信退还钱什么时候到账?
  18. Python中WEB开发(一)
  19. 使用chalk时颜色不变的问题解决
  20. R语言二手车汽车销售数据可视化探索:预处理、平滑密度图、地理空间可视化(带自测题)

热门文章

  1. python中模块下载方法(conda+pip)
  2. python中pdfplumber解析pdf_Python中pdfplumber如何提取pdf中的表格数据
  3. CentOS操作系统中安装JDK的完整步骤
  4. 2018年机器学习算法工程师——秋招自我总结
  5. 用C#将PDF转换为Doc
  6. 【Python】使用Python调用Fragstats批量进行万级及以上数据的景观指数运算
  7. arcgis图像和坐标系统一致但不重合_学习ArcGIS,这62个Arcmap常用操作技巧可能帮到您...
  8. 无线接入中的移动技术
  9. 学硕论文选题计算机,研究生计算机论文题目大全 研究生计算机论文题目哪个好...
  10. 斐讯k2刷无线打印服务器,斐讯K2无线路由器刷华硕固件教程和工具