每个像素在OpenGL中绘制
我曾经用'每像素'绘制小游戏,我的意思是一些SetPixel(x,y,color)函数等等。
我也对OpenGL感兴趣,但不太了解它。
在OpenGL中进行每像素绘制是一种好的(快速)方法吗?
例如,使用纹理四边形作为精灵或整个应用程序背景屏幕,可以使用某种我自己的SetPixel例程设置不同的像素,或者使用其他任何方式 - 但它应该是高效的尽可能多的
(特别是我对OGL的基本1.0版本感兴趣)
您可以设置投影将顶点坐标1:1映射到像素坐标:
glViewport(0, 0, window_width, window_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, window_width, 0, window_height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
从这里开始,顶点X,Y坐标以像素为单位,原点位于左下角。 理论上你可以使用GL_POINT原语的直接模式。 但是批量处理是一个更好的主意。 而不是单独发送每个点创建一个你想绘制的所有点的数组:
struct Vertex
{
GLfloat x,y,red,green,blue;
};
std::vector<Vertex> vertices;
/* fill the vertices vector */
这你可以OpenGL指向...
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
/* Those next two calls don't copy the data, they set a pointer, so vertices must not be deallocated, as long OpenGL points to it! */
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].red);
...并通过一次通话访问并绘制所有内容:
glDrawArrays(GL_POINTS, 0, vertices.size();
你真的不想这样做。
在OpenGL中进行每像素绘制是一种好的(快速)方法吗?
没有好的或快速的方法来做到这一点。 由于速度,它非常灰心。
尽管在OGL 1中并不容易(或者在某些情况下可能),但正确的方法是使用像素着色器或混合模式。 这是唯一正确的方法,其他任何方法都是针对整个系统进行黑客攻击。
根据数据需要修改的方式,顶点颜色和混合模式可能能够解决某些用途。 它不会单独为每个像素着色,但您可以更快地修改纹理。
要做到这一点,您可以绘制单像素四边形(尽管必须小心处理它们并处理滤波以防止模糊),或者您可以获取纹理数据并在稍后进行处理。 两者都会令人难以置信的缓慢,但可以发挥作用。
处理纹理数据可能更简单,可能会稍微快一点。
链接地址: http://www.djcxy.com/p/45731.html