如何在OpenGL中将像素作为纹理绘制到多边形?
Posted
技术标签:
【中文标题】如何在OpenGL中将像素作为纹理绘制到多边形?【英文标题】:How to I draw pixels as a texture to a polygon in OpenGL? 【发布时间】:2009-03-20 01:34:59 【问题描述】:在 C++ OpenGL 中,我想手动将每个像素(作为我假设的纹理)绘制到一个简单的正方形图元上,或者实际上是 2 个多边形形成一个正方形。
我不知道从哪里开始,也不知道要查找哪些短语。我是在寻找纹理映射还是创建纹理?大多数示例都是从文件加载,但我不想这样做。
我尝试阅读我的 OpenGL 编程指南一书,但这只是一个迷宫,因为我对 OpenGL 还很陌生。请帮忙。
【问题讨论】:
也就是说,你想画一个没有透视的纹理? 看到正确的教程后,在这里查看我的帖子-> ***.com/questions/503816/linux-fastest-way-to-draw/… 几何图形将在 3D 意义上进行旋转、变换等。我不确定你的意思是“没有透视图”...... 【参考方案1】:仔细查看 glTexImage2D。这是在 OpenGL 中为 2D 纹理加载图像的调用。
glTexImage2D 实际上采用指向图像中像素数据的原始指针。你可以自己分配内存,直接设置图片数据(随便你),然后调用这个函数把图片传给OpenGL。
创建纹理后,您可以将其绑定到状态,以便您的三角形使用该纹理。
OpenGL 中没有直接要求从文件中加载用作纹理的图像。一个很好的纹理资源可以是found in this GameDev article.
【讨论】:
【参考方案2】:如果您要绘制的正方形是二维的且未旋转,您可能正在寻找glDrawPixels。它允许您在不使用任何多边形的情况下直接将像素的矩形区域绘制到缓冲区。
【讨论】:
【参考方案3】:如果您是新手,那么我建议您从 NeHe 开始的教程一开始。
【讨论】:
【参考方案4】:请注意,虽然@987654321@
需要一个指向要加载的像素的指针,但它并不关心调用后对该数据的任何更改。也就是说,数据真的是从你指定的内存区域加载的,OpenGL会创建一个自己的副本。
这意味着如果数据发生变化,您将需要重新调用 glTexImage2D(),或者使用类似@987654322@
的方法进行部分更新。我建议测试和分析以查看子纹理更新是否快速,不确定实际驱动程序如何针对这种情况进行优化。
【讨论】:
【参考方案5】:感谢 Reed Copsey 将我指向glTexImage2D
。事实证明这很简单;只需将 GLubyte 数组传递给 glTexImage2D
函数(以及绑定纹理所需的所有函数等)。还没有尝试过这种确切的 sn-p 代码,但它应该可以正常工作。数组元素表示行、列和通道的串行版本。
int pixelIndex = 0;
GLubyte pixels[400];
for (int x = 0; x < 10; x++)
for (int y = 0; y < 10; x++)
for (int channel = 0; channel < 4; channel++)
// 0 = black, 255 = white
pixels[pixelIndex++] = 255;
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pixels);
我在 OpenGL 书籍中读过,您可以将 2D 数组用于单色图像,因此我假设您也可以使用 3D 数组。
【讨论】:
【参考方案6】:您要查找的内容通常称为“渲染到纹理”。
http://developer.nvidia.com/object/gdc_oglrtt.html
那个教程很老了。我猜这些扩展中的一些实际上并不是新版本的 OGL 中的扩展。抱歉,我无法提供更多帮助。我不再直接使用图形 API,如果可以的话,我会使用 D3D(为了避免扩展汤,出于其他原因,我不会在这里让你厌烦。)
【讨论】:
以上是关于如何在OpenGL中将像素作为纹理绘制到多边形?的主要内容,如果未能解决你的问题,请参考以下文章