在 C++ OpenGL 中,我想手动将每个像素(作为我假设的纹理)绘制到一个简单的正方形图元上,或者实际上是 2 个多边形形成一个正方形。
我不知道从哪里开始,或者要寻找什么短语。我是在寻找纹理映射还是创建纹理?大多数示例是从文件加载,但我不想这样做。
我试过阅读我的 OpenGL 编程指南书,但它只是一个迷宫,因为我对 OpenGL 还很陌生。请帮忙。
仔细看看 glTexImage2D。这是在 OpenGL 中为 2D 纹理加载图像的调用。
glTexImage2D 实际上采用指向图像中像素数据的原始指针。你可以自己分配内存,直接设置图片数据(随便你),然后调用这个函数把图片传给OpenGL。
创建纹理后,您可以将其绑定到状态,以便您的三角形使用该纹理。
OpenGL 中没有直接要求从文件中加载用作纹理的图像。可以在这篇 GameDev 文章中找到一个很好的纹理资源。
如果您要绘制的正方形是二维的且未旋转,则您可能正在寻找glDrawPixels。它允许您在不使用任何多边形的情况下直接将像素的矩形区域绘制到缓冲区。
如果您是新手,那么我建议您从NeHe的教程一开始。
请注意,虽然glTexImage2D()
需要一个指向要加载的像素的指针,但它并不关心调用后对该数据的任何更改。也就是说,数据实际上是从您指定的内存区域加载的,OpenGL 会创建自己的副本。
这意味着如果数据发生变化,您将需要重新调用 glTexImage2D() 或使用类似glTexSubImage2D()
的方法进行部分更新。我建议测试和分析以查看子纹理更新是否快速,不确定实际驱动程序如何针对这种情况进行优化。
感谢 Reed Copsey 将我指向glTexImage2D
. 事实证明这很简单;只需将 GLubyte 数组传递给glTexImage2D
函数(以及绑定纹理所需的所有函数等)。还没有尝试过这个确切的代码片段,但它应该可以正常工作。数组元素表示行、列和通道的串行版本。
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 数组。
您正在寻找的内容通常称为“渲染到纹理”。
http://developer.nvidia.com/object/gdc_oglrtt.html
那个教程很老了。我猜这些扩展中的一些实际上并不是新版本的 OGL 中的扩展。抱歉,我无法提供更多帮助。我不再直接使用图形 API,如果可以的话,我会使用 D3D(为了避免扩展汤,出于其他原因,我不会在这里让你厌烦。)