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